{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "2420dd50",
   "metadata": {},
   "outputs": [],
   "source": [
    "from sympy import *\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "f59b089d",
   "metadata": {},
   "outputs": [],
   "source": [
    "from sympy.abc import a,b,c,x,y,z,t,k,m,n,l,t"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "3a201778",
   "metadata": {},
   "outputs": [],
   "source": [
    "from sympy.calculus.util import continuous_domain,function_range"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "a2e9f57e",
   "metadata": {},
   "outputs": [],
   "source": [
    "from sys import path"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "1b3ededc",
   "metadata": {},
   "outputs": [],
   "source": [
    "path.append(\"/home/huang/Documents/packaging_tutorial/src\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "20e6769a",
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "['/home/huang/python_code/2023',\n",
       " '/home/huang/anaconda3/lib/python39.zip',\n",
       " '/home/huang/anaconda3/lib/python3.9',\n",
       " '/home/huang/anaconda3/lib/python3.9/lib-dynload',\n",
       " '',\n",
       " '/home/huang/anaconda3/lib/python3.9/site-packages',\n",
       " '/home/huang/anaconda3/lib/python3.9/site-packages/IPython/extensions',\n",
       " '/home/huang/.ipython',\n",
       " '/home/huang/Documents/packaging_tutorial/src']"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "path"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "ee2017aa",
   "metadata": {},
   "outputs": [],
   "source": [
    "%load_ext autoreload \n",
    "%autoreload 1"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 466,
   "id": "1862483b",
   "metadata": {},
   "outputs": [],
   "source": [
    "%aimport function_calculator_package.extreme_points"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "7f472ec2",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "1\n",
      "x**2 + 2*x + 1\n"
     ]
    }
   ],
   "source": [
    "%aimport quadratic_function.base "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 468,
   "id": "615d600d",
   "metadata": {},
   "outputs": [],
   "source": [
    "from function_calculator_package.extreme_points import *"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 411,
   "id": "31358d6b",
   "metadata": {},
   "outputs": [],
   "source": [
    "from quadratic_function.base import quadratic_function"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 392,
   "id": "b0033eb8",
   "metadata": {},
   "outputs": [],
   "source": [
    "%aimport quadratic_function.hyperbola"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 662,
   "id": "ec9f9e3c",
   "metadata": {},
   "outputs": [],
   "source": [
    "from quadratic_function.hyperbola import Hyperbola"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "2fa8aa80",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "id": "ee3f8ab4",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\frac{55 \\sqrt{987}}{1974}$"
      ],
      "text/plain": [
       "55*sqrt(987)/1974"
      ]
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "(S(55)/2)/sqrt(47*21)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "id": "e34b5eff",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle - \\frac{\\sqrt{5}}{5} + \\frac{\\left|{4 x - 1}\\right|}{2 \\sqrt{16 x^{2} + \\left(2 x + 1\\right)^{2}}}$"
      ],
      "text/plain": [
       "-sqrt(5)/5 + Abs(4*x - 1)/(2*sqrt(16*x**2 + (2*x + 1)**2))"
      ]
     },
     "execution_count": 11,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "expr=abs(1-4*x)/(2*sqrt((2*x+1)**2+16*x**2))-1/sqrt(5)\n",
    "expr"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "id": "399329b2",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\left\\{\\frac{1}{56}\\right\\}$"
      ],
      "text/plain": [
       "{1/56}"
      ]
     },
     "execution_count": 12,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "solveset(expr,x,Reals)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "id": "4fdc401c",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\mathbb{R} \\cap \\left\\{\\sqrt{3} \\cos{\\left(x \\right)} - \\frac{8}{5}\\right\\}$"
      ],
      "text/plain": [
       "Intersection({sqrt(3)*cos(x) - 8/5}, Reals)"
      ]
     },
     "execution_count": 13,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "solveset(expand_trig(cos(x+pi/6))-Rational(4,5),sin(x),Reals)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "id": "c404f98c",
   "metadata": {},
   "outputs": [],
   "source": [
    "A,B=nonlinsolve([y-sqrt(3)*x+Rational(8,5),x**2+y**2-1],[x,y])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "id": "fc2cfd6b",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\left( \\frac{\\sqrt{3} \\cdot \\left(\\frac{3 \\sqrt{3}}{2} + 6\\right)}{15}, \\  - \\frac{2}{5} + \\frac{3 \\sqrt{3}}{10}\\right)$"
      ],
      "text/plain": [
       "(sqrt(3)*(3*sqrt(3)/2 + 6)/15, -2/5 + 3*sqrt(3)/10)"
      ]
     },
     "execution_count": 21,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "simplify(B)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "id": "3ea0d9f4",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle - \\frac{\\sqrt{6}}{4} + \\frac{\\sqrt{2}}{4}$"
      ],
      "text/plain": [
       "-sqrt(6)/4 + sqrt(2)/4"
      ]
     },
     "execution_count": 22,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "cos(pi/4+pi/3)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "id": "61c77ac2",
   "metadata": {
    "collapsed": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Help on class Circle in module sympy.geometry.ellipse:\n",
      "\n",
      "class Circle(Ellipse)\n",
      " |  Circle(*args, **kwargs)\n",
      " |  \n",
      " |  A circle in space.\n",
      " |  \n",
      " |  Constructed simply from a center and a radius, from three\n",
      " |  non-collinear points, or the equation of a circle.\n",
      " |  \n",
      " |  Parameters\n",
      " |  ==========\n",
      " |  \n",
      " |  center : Point\n",
      " |  radius : number or SymPy expression\n",
      " |  points : sequence of three Points\n",
      " |  equation : equation of a circle\n",
      " |  \n",
      " |  Attributes\n",
      " |  ==========\n",
      " |  \n",
      " |  radius (synonymous with hradius, vradius, major and minor)\n",
      " |  circumference\n",
      " |  equation\n",
      " |  \n",
      " |  Raises\n",
      " |  ======\n",
      " |  \n",
      " |  GeometryError\n",
      " |      When the given equation is not that of a circle.\n",
      " |      When trying to construct circle from incorrect parameters.\n",
      " |  \n",
      " |  See Also\n",
      " |  ========\n",
      " |  \n",
      " |  Ellipse, sympy.geometry.point.Point\n",
      " |  \n",
      " |  Examples\n",
      " |  ========\n",
      " |  \n",
      " |  >>> from sympy import Point, Circle, Eq\n",
      " |  >>> from sympy.abc import x, y, a, b\n",
      " |  \n",
      " |  A circle constructed from a center and radius:\n",
      " |  \n",
      " |  >>> c1 = Circle(Point(0, 0), 5)\n",
      " |  >>> c1.hradius, c1.vradius, c1.radius\n",
      " |  (5, 5, 5)\n",
      " |  \n",
      " |  A circle constructed from three points:\n",
      " |  \n",
      " |  >>> c2 = Circle(Point(0, 0), Point(1, 1), Point(1, 0))\n",
      " |  >>> c2.hradius, c2.vradius, c2.radius, c2.center\n",
      " |  (sqrt(2)/2, sqrt(2)/2, sqrt(2)/2, Point2D(1/2, 1/2))\n",
      " |  \n",
      " |  A circle can be constructed from an equation in the form\n",
      " |  `a*x**2 + by**2 + gx + hy + c = 0`, too:\n",
      " |  \n",
      " |  >>> Circle(x**2 + y**2 - 25)\n",
      " |  Circle(Point2D(0, 0), 5)\n",
      " |  \n",
      " |  If the variables corresponding to x and y are named something\n",
      " |  else, their name or symbol can be supplied:\n",
      " |  \n",
      " |  >>> Circle(Eq(a**2 + b**2, 25), x='a', y=b)\n",
      " |  Circle(Point2D(0, 0), 5)\n",
      " |  \n",
      " |  Method resolution order:\n",
      " |      Circle\n",
      " |      Ellipse\n",
      " |      sympy.geometry.entity.GeometrySet\n",
      " |      sympy.geometry.entity.GeometryEntity\n",
      " |      sympy.sets.sets.Set\n",
      " |      sympy.core.basic.Basic\n",
      " |      sympy.printing.defaults.Printable\n",
      " |      sympy.core.evalf.EvalfMixin\n",
      " |      builtins.object\n",
      " |  \n",
      " |  Methods defined here:\n",
      " |  \n",
      " |  equation(self, x='x', y='y')\n",
      " |      The equation of the circle.\n",
      " |      \n",
      " |      Parameters\n",
      " |      ==========\n",
      " |      \n",
      " |      x : str or Symbol, optional\n",
      " |          Default value is 'x'.\n",
      " |      y : str or Symbol, optional\n",
      " |          Default value is 'y'.\n",
      " |      \n",
      " |      Returns\n",
      " |      =======\n",
      " |      \n",
      " |      equation : SymPy expression\n",
      " |      \n",
      " |      Examples\n",
      " |      ========\n",
      " |      \n",
      " |      >>> from sympy import Point, Circle\n",
      " |      >>> c1 = Circle(Point(0, 0), 5)\n",
      " |      >>> c1.equation()\n",
      " |      x**2 + y**2 - 25\n",
      " |  \n",
      " |  intersection(self, o)\n",
      " |      The intersection of this circle with another geometrical entity.\n",
      " |      \n",
      " |      Parameters\n",
      " |      ==========\n",
      " |      \n",
      " |      o : GeometryEntity\n",
      " |      \n",
      " |      Returns\n",
      " |      =======\n",
      " |      \n",
      " |      intersection : list of GeometryEntities\n",
      " |      \n",
      " |      Examples\n",
      " |      ========\n",
      " |      \n",
      " |      >>> from sympy import Point, Circle, Line, Ray\n",
      " |      >>> p1, p2, p3 = Point(0, 0), Point(5, 5), Point(6, 0)\n",
      " |      >>> p4 = Point(5, 0)\n",
      " |      >>> c1 = Circle(p1, 5)\n",
      " |      >>> c1.intersection(p2)\n",
      " |      []\n",
      " |      >>> c1.intersection(p4)\n",
      " |      [Point2D(5, 0)]\n",
      " |      >>> c1.intersection(Ray(p1, p2))\n",
      " |      [Point2D(5*sqrt(2)/2, 5*sqrt(2)/2)]\n",
      " |      >>> c1.intersection(Line(p2, p3))\n",
      " |      []\n",
      " |  \n",
      " |  reflect(self, line)\n",
      " |      Override GeometryEntity.reflect since the radius\n",
      " |      is not a GeometryEntity.\n",
      " |      \n",
      " |      Examples\n",
      " |      ========\n",
      " |      \n",
      " |      >>> from sympy import Circle, Line\n",
      " |      >>> Circle((0, 1), 1).reflect(Line((0, 0), (1, 1)))\n",
      " |      Circle(Point2D(1, 0), -1)\n",
      " |  \n",
      " |  scale(self, x=1, y=1, pt=None)\n",
      " |      Override GeometryEntity.scale since the radius\n",
      " |      is not a GeometryEntity.\n",
      " |      \n",
      " |      Examples\n",
      " |      ========\n",
      " |      \n",
      " |      >>> from sympy import Circle\n",
      " |      >>> Circle((0, 0), 1).scale(2, 2)\n",
      " |      Circle(Point2D(0, 0), 2)\n",
      " |      >>> Circle((0, 0), 1).scale(2, 4)\n",
      " |      Ellipse(Point2D(0, 0), 2, 4)\n",
      " |  \n",
      " |  ----------------------------------------------------------------------\n",
      " |  Static methods defined here:\n",
      " |  \n",
      " |  __new__(cls, *args, **kwargs)\n",
      " |      Create and return a new object.  See help(type) for accurate signature.\n",
      " |  \n",
      " |  ----------------------------------------------------------------------\n",
      " |  Readonly properties defined here:\n",
      " |  \n",
      " |  __sympy__\n",
      " |  \n",
      " |  circumference\n",
      " |      The circumference of the circle.\n",
      " |      \n",
      " |      Returns\n",
      " |      =======\n",
      " |      \n",
      " |      circumference : number or SymPy expression\n",
      " |      \n",
      " |      Examples\n",
      " |      ========\n",
      " |      \n",
      " |      >>> from sympy import Point, Circle\n",
      " |      >>> c1 = Circle(Point(3, 4), 6)\n",
      " |      >>> c1.circumference\n",
      " |      12*pi\n",
      " |  \n",
      " |  radius\n",
      " |      The radius of the circle.\n",
      " |      \n",
      " |      Returns\n",
      " |      =======\n",
      " |      \n",
      " |      radius : number or SymPy expression\n",
      " |      \n",
      " |      See Also\n",
      " |      ========\n",
      " |      \n",
      " |      Ellipse.major, Ellipse.minor, Ellipse.hradius, Ellipse.vradius\n",
      " |      \n",
      " |      Examples\n",
      " |      ========\n",
      " |      \n",
      " |      >>> from sympy import Point, Circle\n",
      " |      >>> c1 = Circle(Point(3, 4), 6)\n",
      " |      >>> c1.radius\n",
      " |      6\n",
      " |  \n",
      " |  vradius\n",
      " |      This Ellipse property is an alias for the Circle's radius.\n",
      " |      \n",
      " |      Whereas hradius, major and minor can use Ellipse's conventions,\n",
      " |      the vradius does not exist for a circle. It is always a positive\n",
      " |      value in order that the Circle, like Polygons, will have an\n",
      " |      area that can be positive or negative as determined by the sign\n",
      " |      of the hradius.\n",
      " |      \n",
      " |      Examples\n",
      " |      ========\n",
      " |      \n",
      " |      >>> from sympy import Point, Circle\n",
      " |      >>> c1 = Circle(Point(3, 4), 6)\n",
      " |      >>> c1.vradius\n",
      " |      6\n",
      " |  \n",
      " |  ----------------------------------------------------------------------\n",
      " |  Data and other attributes defined here:\n",
      " |  \n",
      " |  default_assumptions = {}\n",
      " |  \n",
      " |  ----------------------------------------------------------------------\n",
      " |  Methods inherited from Ellipse:\n",
      " |  \n",
      " |  __contains__(self, o)\n",
      " |      Subclasses should implement this method for anything more complex than equality.\n",
      " |  \n",
      " |  __eq__(self, o)\n",
      " |      Is the other GeometryEntity the same as this ellipse?\n",
      " |  \n",
      " |  __hash__(self)\n",
      " |      Return hash(self).\n",
      " |  \n",
      " |  arbitrary_point(self, parameter='t')\n",
      " |      A parameterized point on the ellipse.\n",
      " |      \n",
      " |      Parameters\n",
      " |      ==========\n",
      " |      \n",
      " |      parameter : str, optional\n",
      " |          Default value is 't'.\n",
      " |      \n",
      " |      Returns\n",
      " |      =======\n",
      " |      \n",
      " |      arbitrary_point : Point\n",
      " |      \n",
      " |      Raises\n",
      " |      ======\n",
      " |      \n",
      " |      ValueError\n",
      " |          When `parameter` already appears in the functions.\n",
      " |      \n",
      " |      See Also\n",
      " |      ========\n",
      " |      \n",
      " |      sympy.geometry.point.Point\n",
      " |      \n",
      " |      Examples\n",
      " |      ========\n",
      " |      \n",
      " |      >>> from sympy import Point, Ellipse\n",
      " |      >>> e1 = Ellipse(Point(0, 0), 3, 2)\n",
      " |      >>> e1.arbitrary_point()\n",
      " |      Point2D(3*cos(t), 2*sin(t))\n",
      " |  \n",
      " |  auxiliary_circle(self)\n",
      " |      Returns a Circle whose diameter is the major axis of the ellipse.\n",
      " |      \n",
      " |      Examples\n",
      " |      ========\n",
      " |      \n",
      " |      >>> from sympy import Ellipse, Point, symbols\n",
      " |      >>> c = Point(1, 2)\n",
      " |      >>> Ellipse(c, 8, 7).auxiliary_circle()\n",
      " |      Circle(Point2D(1, 2), 8)\n",
      " |      >>> a, b = symbols('a b')\n",
      " |      >>> Ellipse(c, a, b).auxiliary_circle()\n",
      " |      Circle(Point2D(1, 2), Max(a, b))\n",
      " |  \n",
      " |  director_circle(self)\n",
      " |      Returns a Circle consisting of all points where two perpendicular\n",
      " |      tangent lines to the ellipse cross each other.\n",
      " |      \n",
      " |      Returns\n",
      " |      =======\n",
      " |      \n",
      " |      Circle\n",
      " |          A director circle returned as a geometric object.\n",
      " |      \n",
      " |      Examples\n",
      " |      ========\n",
      " |      \n",
      " |      >>> from sympy import Ellipse, Point, symbols\n",
      " |      >>> c = Point(3,8)\n",
      " |      >>> Ellipse(c, 7, 9).director_circle()\n",
      " |      Circle(Point2D(3, 8), sqrt(130))\n",
      " |      >>> a, b = symbols('a b')\n",
      " |      >>> Ellipse(c, a, b).director_circle()\n",
      " |      Circle(Point2D(3, 8), sqrt(a**2 + b**2))\n",
      " |      \n",
      " |      References\n",
      " |      ==========\n",
      " |      \n",
      " |      .. [1] https://en.wikipedia.org/wiki/Director_circle\n",
      " |  \n",
      " |  encloses_point(self, p)\n",
      " |      Return True if p is enclosed by (is inside of) self.\n",
      " |      \n",
      " |      Notes\n",
      " |      -----\n",
      " |      Being on the border of self is considered False.\n",
      " |      \n",
      " |      Parameters\n",
      " |      ==========\n",
      " |      \n",
      " |      p : Point\n",
      " |      \n",
      " |      Returns\n",
      " |      =======\n",
      " |      \n",
      " |      encloses_point : True, False or None\n",
      " |      \n",
      " |      See Also\n",
      " |      ========\n",
      " |      \n",
      " |      sympy.geometry.point.Point\n",
      " |      \n",
      " |      Examples\n",
      " |      ========\n",
      " |      \n",
      " |      >>> from sympy import Ellipse, S\n",
      " |      >>> from sympy.abc import t\n",
      " |      >>> e = Ellipse((0, 0), 3, 2)\n",
      " |      >>> e.encloses_point((0, 0))\n",
      " |      True\n",
      " |      >>> e.encloses_point(e.arbitrary_point(t).subs(t, S.Half))\n",
      " |      False\n",
      " |      >>> e.encloses_point((4, 0))\n",
      " |      False\n",
      " |  \n",
      " |  evolute(self, x='x', y='y')\n",
      " |      The equation of evolute of the ellipse.\n",
      " |      \n",
      " |      Parameters\n",
      " |      ==========\n",
      " |      \n",
      " |      x : str, optional\n",
      " |          Label for the x-axis. Default value is 'x'.\n",
      " |      y : str, optional\n",
      " |          Label for the y-axis. Default value is 'y'.\n",
      " |      \n",
      " |      Returns\n",
      " |      =======\n",
      " |      \n",
      " |      equation : SymPy expression\n",
      " |      \n",
      " |      Examples\n",
      " |      ========\n",
      " |      \n",
      " |      >>> from sympy import Point, Ellipse\n",
      " |      >>> e1 = Ellipse(Point(1, 0), 3, 2)\n",
      " |      >>> e1.evolute()\n",
      " |      2**(2/3)*y**(2/3) + (3*x - 3)**(2/3) - 5**(2/3)\n",
      " |  \n",
      " |  is_tangent(self, o)\n",
      " |      Is `o` tangent to the ellipse?\n",
      " |      \n",
      " |      Parameters\n",
      " |      ==========\n",
      " |      \n",
      " |      o : GeometryEntity\n",
      " |          An Ellipse, LinearEntity or Polygon\n",
      " |      \n",
      " |      Raises\n",
      " |      ======\n",
      " |      \n",
      " |      NotImplementedError\n",
      " |          When the wrong type of argument is supplied.\n",
      " |      \n",
      " |      Returns\n",
      " |      =======\n",
      " |      \n",
      " |      is_tangent: boolean\n",
      " |          True if o is tangent to the ellipse, False otherwise.\n",
      " |      \n",
      " |      See Also\n",
      " |      ========\n",
      " |      \n",
      " |      tangent_lines\n",
      " |      \n",
      " |      Examples\n",
      " |      ========\n",
      " |      \n",
      " |      >>> from sympy import Point, Ellipse, Line\n",
      " |      >>> p0, p1, p2 = Point(0, 0), Point(3, 0), Point(3, 3)\n",
      " |      >>> e1 = Ellipse(p0, 3, 2)\n",
      " |      >>> l1 = Line(p1, p2)\n",
      " |      >>> e1.is_tangent(l1)\n",
      " |      True\n",
      " |  \n",
      " |  normal_lines(self, p, prec=None)\n",
      " |      Normal lines between `p` and the ellipse.\n",
      " |      \n",
      " |      Parameters\n",
      " |      ==========\n",
      " |      \n",
      " |      p : Point\n",
      " |      \n",
      " |      Returns\n",
      " |      =======\n",
      " |      \n",
      " |      normal_lines : list with 1, 2 or 4 Lines\n",
      " |      \n",
      " |      Examples\n",
      " |      ========\n",
      " |      \n",
      " |      >>> from sympy import Point, Ellipse\n",
      " |      >>> e = Ellipse((0, 0), 2, 3)\n",
      " |      >>> c = e.center\n",
      " |      >>> e.normal_lines(c + Point(1, 0))\n",
      " |      [Line2D(Point2D(0, 0), Point2D(1, 0))]\n",
      " |      >>> e.normal_lines(c)\n",
      " |      [Line2D(Point2D(0, 0), Point2D(0, 1)), Line2D(Point2D(0, 0), Point2D(1, 0))]\n",
      " |      \n",
      " |      Off-axis points require the solution of a quartic equation. This\n",
      " |      often leads to very large expressions that may be of little practical\n",
      " |      use. An approximate solution of `prec` digits can be obtained by\n",
      " |      passing in the desired value:\n",
      " |      \n",
      " |      >>> e.normal_lines((3, 3), prec=2)\n",
      " |      [Line2D(Point2D(-0.81, -2.7), Point2D(0.19, -1.2)),\n",
      " |      Line2D(Point2D(1.5, -2.0), Point2D(2.5, -2.7))]\n",
      " |      \n",
      " |      Whereas the above solution has an operation count of 12, the exact\n",
      " |      solution has an operation count of 2020.\n",
      " |  \n",
      " |  plot_interval(self, parameter='t')\n",
      " |      The plot interval for the default geometric plot of the Ellipse.\n",
      " |      \n",
      " |      Parameters\n",
      " |      ==========\n",
      " |      \n",
      " |      parameter : str, optional\n",
      " |          Default value is 't'.\n",
      " |      \n",
      " |      Returns\n",
      " |      =======\n",
      " |      \n",
      " |      plot_interval : list\n",
      " |          [parameter, lower_bound, upper_bound]\n",
      " |      \n",
      " |      Examples\n",
      " |      ========\n",
      " |      \n",
      " |      >>> from sympy import Point, Ellipse\n",
      " |      >>> e1 = Ellipse(Point(0, 0), 3, 2)\n",
      " |      >>> e1.plot_interval()\n",
      " |      [t, -pi, pi]\n",
      " |  \n",
      " |  polar_second_moment_of_area(self)\n",
      " |      Returns the polar second moment of area of an Ellipse\n",
      " |      \n",
      " |      It is a constituent of the second moment of area, linked through\n",
      " |      the perpendicular axis theorem. While the planar second moment of\n",
      " |      area describes an object's resistance to deflection (bending) when\n",
      " |      subjected to a force applied to a plane parallel to the central\n",
      " |      axis, the polar second moment of area describes an object's\n",
      " |      resistance to deflection when subjected to a moment applied in a\n",
      " |      plane perpendicular to the object's central axis (i.e. parallel to\n",
      " |      the cross-section)\n",
      " |      \n",
      " |      Examples\n",
      " |      ========\n",
      " |      \n",
      " |      >>> from sympy import symbols, Circle, Ellipse\n",
      " |      >>> c = Circle((5, 5), 4)\n",
      " |      >>> c.polar_second_moment_of_area()\n",
      " |      128*pi\n",
      " |      >>> a, b = symbols('a, b')\n",
      " |      >>> e = Ellipse((0, 0), a, b)\n",
      " |      >>> e.polar_second_moment_of_area()\n",
      " |      pi*a**3*b/4 + pi*a*b**3/4\n",
      " |      \n",
      " |      References\n",
      " |      ==========\n",
      " |      \n",
      " |      .. [1] https://en.wikipedia.org/wiki/Polar_moment_of_inertia\n",
      " |  \n",
      " |  random_point(self, seed=None)\n",
      " |      A random point on the ellipse.\n",
      " |      \n",
      " |      Returns\n",
      " |      =======\n",
      " |      \n",
      " |      point : Point\n",
      " |      \n",
      " |      Examples\n",
      " |      ========\n",
      " |      \n",
      " |      >>> from sympy import Point, Ellipse\n",
      " |      >>> e1 = Ellipse(Point(0, 0), 3, 2)\n",
      " |      >>> e1.random_point() # gives some random point\n",
      " |      Point2D(...)\n",
      " |      >>> p1 = e1.random_point(seed=0); p1.n(2)\n",
      " |      Point2D(2.1, 1.4)\n",
      " |      \n",
      " |      Notes\n",
      " |      =====\n",
      " |      \n",
      " |      When creating a random point, one may simply replace the\n",
      " |      parameter with a random number. When doing so, however, the\n",
      " |      random number should be made a Rational or else the point\n",
      " |      may not test as being in the ellipse:\n",
      " |      \n",
      " |      >>> from sympy.abc import t\n",
      " |      >>> from sympy import Rational\n",
      " |      >>> arb = e1.arbitrary_point(t); arb\n",
      " |      Point2D(3*cos(t), 2*sin(t))\n",
      " |      >>> arb.subs(t, .1) in e1\n",
      " |      False\n",
      " |      >>> arb.subs(t, Rational(.1)) in e1\n",
      " |      True\n",
      " |      >>> arb.subs(t, Rational('.1')) in e1\n",
      " |      True\n",
      " |      \n",
      " |      See Also\n",
      " |      ========\n",
      " |      sympy.geometry.point.Point\n",
      " |      arbitrary_point : Returns parameterized point on ellipse\n",
      " |  \n",
      " |  rotate(self, angle=0, pt=None)\n",
      " |      Rotate ``angle`` radians counterclockwise about Point ``pt``.\n",
      " |      \n",
      " |      Note: since the general ellipse is not supported, only rotations that\n",
      " |      are integer multiples of pi/2 are allowed.\n",
      " |      \n",
      " |      Examples\n",
      " |      ========\n",
      " |      \n",
      " |      >>> from sympy import Ellipse, pi\n",
      " |      >>> Ellipse((1, 0), 2, 1).rotate(pi/2)\n",
      " |      Ellipse(Point2D(0, 1), 1, 2)\n",
      " |      >>> Ellipse((1, 0), 2, 1).rotate(pi)\n",
      " |      Ellipse(Point2D(-1, 0), 2, 1)\n",
      " |  \n",
      " |  second_moment_of_area(self, point=None)\n",
      " |      Returns the second moment and product moment area of an ellipse.\n",
      " |      \n",
      " |      Parameters\n",
      " |      ==========\n",
      " |      \n",
      " |      point : Point, two-tuple of sympifiable objects, or None(default=None)\n",
      " |          point is the point about which second moment of area is to be found.\n",
      " |          If \"point=None\" it will be calculated about the axis passing through the\n",
      " |          centroid of the ellipse.\n",
      " |      \n",
      " |      Returns\n",
      " |      =======\n",
      " |      \n",
      " |      I_xx, I_yy, I_xy : number or SymPy expression\n",
      " |          I_xx, I_yy are second moment of area of an ellise.\n",
      " |          I_xy is product moment of area of an ellipse.\n",
      " |      \n",
      " |      Examples\n",
      " |      ========\n",
      " |      \n",
      " |      >>> from sympy import Point, Ellipse\n",
      " |      >>> p1 = Point(0, 0)\n",
      " |      >>> e1 = Ellipse(p1, 3, 1)\n",
      " |      >>> e1.second_moment_of_area()\n",
      " |      (3*pi/4, 27*pi/4, 0)\n",
      " |      \n",
      " |      References\n",
      " |      ==========\n",
      " |      \n",
      " |      .. [1] https://en.wikipedia.org/wiki/List_of_second_moments_of_area\n",
      " |  \n",
      " |  section_modulus(self, point=None)\n",
      " |      Returns a tuple with the section modulus of an ellipse\n",
      " |      \n",
      " |      Section modulus is a geometric property of an ellipse defined as the\n",
      " |      ratio of second moment of area to the distance of the extreme end of\n",
      " |      the ellipse from the centroidal axis.\n",
      " |      \n",
      " |      Parameters\n",
      " |      ==========\n",
      " |      \n",
      " |      point : Point, two-tuple of sympifyable objects, or None(default=None)\n",
      " |          point is the point at which section modulus is to be found.\n",
      " |          If \"point=None\" section modulus will be calculated for the\n",
      " |          point farthest from the centroidal axis of the ellipse.\n",
      " |      \n",
      " |      Returns\n",
      " |      =======\n",
      " |      \n",
      " |      S_x, S_y: numbers or SymPy expressions\n",
      " |                S_x is the section modulus with respect to the x-axis\n",
      " |                S_y is the section modulus with respect to the y-axis\n",
      " |                A negative sign indicates that the section modulus is\n",
      " |                determined for a point below the centroidal axis.\n",
      " |      \n",
      " |      Examples\n",
      " |      ========\n",
      " |      \n",
      " |      >>> from sympy import Symbol, Ellipse, Circle, Point2D\n",
      " |      >>> d = Symbol('d', positive=True)\n",
      " |      >>> c = Circle((0, 0), d/2)\n",
      " |      >>> c.section_modulus()\n",
      " |      (pi*d**3/32, pi*d**3/32)\n",
      " |      >>> e = Ellipse(Point2D(0, 0), 2, 4)\n",
      " |      >>> e.section_modulus()\n",
      " |      (8*pi, 4*pi)\n",
      " |      >>> e.section_modulus((2, 2))\n",
      " |      (16*pi, 4*pi)\n",
      " |      \n",
      " |      References\n",
      " |      ==========\n",
      " |      \n",
      " |      .. [1] https://en.wikipedia.org/wiki/Section_modulus\n",
      " |  \n",
      " |  tangent_lines(self, p)\n",
      " |      Tangent lines between `p` and the ellipse.\n",
      " |      \n",
      " |      If `p` is on the ellipse, returns the tangent line through point `p`.\n",
      " |      Otherwise, returns the tangent line(s) from `p` to the ellipse, or\n",
      " |      None if no tangent line is possible (e.g., `p` inside ellipse).\n",
      " |      \n",
      " |      Parameters\n",
      " |      ==========\n",
      " |      \n",
      " |      p : Point\n",
      " |      \n",
      " |      Returns\n",
      " |      =======\n",
      " |      \n",
      " |      tangent_lines : list with 1 or 2 Lines\n",
      " |      \n",
      " |      Raises\n",
      " |      ======\n",
      " |      \n",
      " |      NotImplementedError\n",
      " |          Can only find tangent lines for a point, `p`, on the ellipse.\n",
      " |      \n",
      " |      See Also\n",
      " |      ========\n",
      " |      \n",
      " |      sympy.geometry.point.Point, sympy.geometry.line.Line\n",
      " |      \n",
      " |      Examples\n",
      " |      ========\n",
      " |      \n",
      " |      >>> from sympy import Point, Ellipse\n",
      " |      >>> e1 = Ellipse(Point(0, 0), 3, 2)\n",
      " |      >>> e1.tangent_lines(Point(3, 0))\n",
      " |      [Line2D(Point2D(3, 0), Point2D(3, -12))]\n",
      " |  \n",
      " |  ----------------------------------------------------------------------\n",
      " |  Readonly properties inherited from Ellipse:\n",
      " |  \n",
      " |  ambient_dimension\n",
      " |      What is the dimension of the space that the object is contained in?\n",
      " |  \n",
      " |  apoapsis\n",
      " |      The apoapsis of the ellipse.\n",
      " |      \n",
      " |      The greatest distance between the focus and the contour.\n",
      " |      \n",
      " |      Returns\n",
      " |      =======\n",
      " |      \n",
      " |      apoapsis : number\n",
      " |      \n",
      " |      See Also\n",
      " |      ========\n",
      " |      \n",
      " |      periapsis : Returns shortest distance between foci and contour\n",
      " |      \n",
      " |      Examples\n",
      " |      ========\n",
      " |      \n",
      " |      >>> from sympy import Point, Ellipse\n",
      " |      >>> p1 = Point(0, 0)\n",
      " |      >>> e1 = Ellipse(p1, 3, 1)\n",
      " |      >>> e1.apoapsis\n",
      " |      2*sqrt(2) + 3\n",
      " |  \n",
      " |  area\n",
      " |      The area of the ellipse.\n",
      " |      \n",
      " |      Returns\n",
      " |      =======\n",
      " |      \n",
      " |      area : number\n",
      " |      \n",
      " |      Examples\n",
      " |      ========\n",
      " |      \n",
      " |      >>> from sympy import Point, Ellipse\n",
      " |      >>> p1 = Point(0, 0)\n",
      " |      >>> e1 = Ellipse(p1, 3, 1)\n",
      " |      >>> e1.area\n",
      " |      3*pi\n",
      " |  \n",
      " |  bounds\n",
      " |      Return a tuple (xmin, ymin, xmax, ymax) representing the bounding\n",
      " |      rectangle for the geometric figure.\n",
      " |  \n",
      " |  center\n",
      " |      The center of the ellipse.\n",
      " |      \n",
      " |      Returns\n",
      " |      =======\n",
      " |      \n",
      " |      center : number\n",
      " |      \n",
      " |      See Also\n",
      " |      ========\n",
      " |      \n",
      " |      sympy.geometry.point.Point\n",
      " |      \n",
      " |      Examples\n",
      " |      ========\n",
      " |      \n",
      " |      >>> from sympy import Point, Ellipse\n",
      " |      >>> p1 = Point(0, 0)\n",
      " |      >>> e1 = Ellipse(p1, 3, 1)\n",
      " |      >>> e1.center\n",
      " |      Point2D(0, 0)\n",
      " |  \n",
      " |  eccentricity\n",
      " |      The eccentricity of the ellipse.\n",
      " |      \n",
      " |      Returns\n",
      " |      =======\n",
      " |      \n",
      " |      eccentricity : number\n",
      " |      \n",
      " |      Examples\n",
      " |      ========\n",
      " |      \n",
      " |      >>> from sympy import Point, Ellipse, sqrt\n",
      " |      >>> p1 = Point(0, 0)\n",
      " |      >>> e1 = Ellipse(p1, 3, sqrt(2))\n",
      " |      >>> e1.eccentricity\n",
      " |      sqrt(7)/3\n",
      " |  \n",
      " |  foci\n",
      " |      The foci of the ellipse.\n",
      " |      \n",
      " |      Notes\n",
      " |      -----\n",
      " |      The foci can only be calculated if the major/minor axes are known.\n",
      " |      \n",
      " |      Raises\n",
      " |      ======\n",
      " |      \n",
      " |      ValueError\n",
      " |          When the major and minor axis cannot be determined.\n",
      " |      \n",
      " |      See Also\n",
      " |      ========\n",
      " |      \n",
      " |      sympy.geometry.point.Point\n",
      " |      focus_distance : Returns the distance between focus and center\n",
      " |      \n",
      " |      Examples\n",
      " |      ========\n",
      " |      \n",
      " |      >>> from sympy import Point, Ellipse\n",
      " |      >>> p1 = Point(0, 0)\n",
      " |      >>> e1 = Ellipse(p1, 3, 1)\n",
      " |      >>> e1.foci\n",
      " |      (Point2D(-2*sqrt(2), 0), Point2D(2*sqrt(2), 0))\n",
      " |  \n",
      " |  focus_distance\n",
      " |      The focal distance of the ellipse.\n",
      " |      \n",
      " |      The distance between the center and one focus.\n",
      " |      \n",
      " |      Returns\n",
      " |      =======\n",
      " |      \n",
      " |      focus_distance : number\n",
      " |      \n",
      " |      See Also\n",
      " |      ========\n",
      " |      \n",
      " |      foci\n",
      " |      \n",
      " |      Examples\n",
      " |      ========\n",
      " |      \n",
      " |      >>> from sympy import Point, Ellipse\n",
      " |      >>> p1 = Point(0, 0)\n",
      " |      >>> e1 = Ellipse(p1, 3, 1)\n",
      " |      >>> e1.focus_distance\n",
      " |      2*sqrt(2)\n",
      " |  \n",
      " |  hradius\n",
      " |      The horizontal radius of the ellipse.\n",
      " |      \n",
      " |      Returns\n",
      " |      =======\n",
      " |      \n",
      " |      hradius : number\n",
      " |      \n",
      " |      See Also\n",
      " |      ========\n",
      " |      \n",
      " |      vradius, major, minor\n",
      " |      \n",
      " |      Examples\n",
      " |      ========\n",
      " |      \n",
      " |      >>> from sympy import Point, Ellipse\n",
      " |      >>> p1 = Point(0, 0)\n",
      " |      >>> e1 = Ellipse(p1, 3, 1)\n",
      " |      >>> e1.hradius\n",
      " |      3\n",
      " |  \n",
      " |  major\n",
      " |      Longer axis of the ellipse (if it can be determined) else hradius.\n",
      " |      \n",
      " |      Returns\n",
      " |      =======\n",
      " |      \n",
      " |      major : number or expression\n",
      " |      \n",
      " |      See Also\n",
      " |      ========\n",
      " |      \n",
      " |      hradius, vradius, minor\n",
      " |      \n",
      " |      Examples\n",
      " |      ========\n",
      " |      \n",
      " |      >>> from sympy import Point, Ellipse, Symbol\n",
      " |      >>> p1 = Point(0, 0)\n",
      " |      >>> e1 = Ellipse(p1, 3, 1)\n",
      " |      >>> e1.major\n",
      " |      3\n",
      " |      \n",
      " |      >>> a = Symbol('a')\n",
      " |      >>> b = Symbol('b')\n",
      " |      >>> Ellipse(p1, a, b).major\n",
      " |      a\n",
      " |      >>> Ellipse(p1, b, a).major\n",
      " |      b\n",
      " |      \n",
      " |      >>> m = Symbol('m')\n",
      " |      >>> M = m + 1\n",
      " |      >>> Ellipse(p1, m, M).major\n",
      " |      m + 1\n",
      " |  \n",
      " |  minor\n",
      " |      Shorter axis of the ellipse (if it can be determined) else vradius.\n",
      " |      \n",
      " |      Returns\n",
      " |      =======\n",
      " |      \n",
      " |      minor : number or expression\n",
      " |      \n",
      " |      See Also\n",
      " |      ========\n",
      " |      \n",
      " |      hradius, vradius, major\n",
      " |      \n",
      " |      Examples\n",
      " |      ========\n",
      " |      \n",
      " |      >>> from sympy import Point, Ellipse, Symbol\n",
      " |      >>> p1 = Point(0, 0)\n",
      " |      >>> e1 = Ellipse(p1, 3, 1)\n",
      " |      >>> e1.minor\n",
      " |      1\n",
      " |      \n",
      " |      >>> a = Symbol('a')\n",
      " |      >>> b = Symbol('b')\n",
      " |      >>> Ellipse(p1, a, b).minor\n",
      " |      b\n",
      " |      >>> Ellipse(p1, b, a).minor\n",
      " |      a\n",
      " |      \n",
      " |      >>> m = Symbol('m')\n",
      " |      >>> M = m + 1\n",
      " |      >>> Ellipse(p1, m, M).minor\n",
      " |      m\n",
      " |  \n",
      " |  periapsis\n",
      " |      The periapsis of the ellipse.\n",
      " |      \n",
      " |      The shortest distance between the focus and the contour.\n",
      " |      \n",
      " |      Returns\n",
      " |      =======\n",
      " |      \n",
      " |      periapsis : number\n",
      " |      \n",
      " |      See Also\n",
      " |      ========\n",
      " |      \n",
      " |      apoapsis : Returns greatest distance between focus and contour\n",
      " |      \n",
      " |      Examples\n",
      " |      ========\n",
      " |      \n",
      " |      >>> from sympy import Point, Ellipse\n",
      " |      >>> p1 = Point(0, 0)\n",
      " |      >>> e1 = Ellipse(p1, 3, 1)\n",
      " |      >>> e1.periapsis\n",
      " |      3 - 2*sqrt(2)\n",
      " |  \n",
      " |  semilatus_rectum\n",
      " |      Calculates the semi-latus rectum of the Ellipse.\n",
      " |      \n",
      " |      Semi-latus rectum is defined as one half of the chord through a\n",
      " |      focus parallel to the conic section directrix of a conic section.\n",
      " |      \n",
      " |      Returns\n",
      " |      =======\n",
      " |      \n",
      " |      semilatus_rectum : number\n",
      " |      \n",
      " |      See Also\n",
      " |      ========\n",
      " |      \n",
      " |      apoapsis : Returns greatest distance between focus and contour\n",
      " |      \n",
      " |      periapsis : The shortest distance between the focus and the contour\n",
      " |      \n",
      " |      Examples\n",
      " |      ========\n",
      " |      \n",
      " |      >>> from sympy import Point, Ellipse\n",
      " |      >>> p1 = Point(0, 0)\n",
      " |      >>> e1 = Ellipse(p1, 3, 1)\n",
      " |      >>> e1.semilatus_rectum\n",
      " |      1/3\n",
      " |      \n",
      " |      References\n",
      " |      ==========\n",
      " |      \n",
      " |      .. [1] http://mathworld.wolfram.com/SemilatusRectum.html\n",
      " |      .. [2] https://en.wikipedia.org/wiki/Ellipse#Semi-latus_rectum\n",
      " |  \n",
      " |  ----------------------------------------------------------------------\n",
      " |  Data descriptors inherited from Ellipse:\n",
      " |  \n",
      " |  __dict__\n",
      " |      dictionary for instance variables (if defined)\n",
      " |  \n",
      " |  __weakref__\n",
      " |      list of weak references to the object (if defined)\n",
      " |  \n",
      " |  ----------------------------------------------------------------------\n",
      " |  Methods inherited from sympy.geometry.entity.GeometryEntity:\n",
      " |  \n",
      " |  __cmp__(self, other)\n",
      " |      Comparison of two GeometryEntities.\n",
      " |  \n",
      " |  __getnewargs__(self)\n",
      " |      Returns a tuple that will be passed to __new__ on unpickling.\n",
      " |  \n",
      " |  __ne__(self, o)\n",
      " |      Test inequality of two geometrical entities.\n",
      " |  \n",
      " |  __radd__(self, a)\n",
      " |      Implementation of reverse add method.\n",
      " |  \n",
      " |  __repr__(self)\n",
      " |      String representation of a GeometryEntity that can be evaluated\n",
      " |      by sympy.\n",
      " |  \n",
      " |  __rmul__(self, a)\n",
      " |      Implementation of reverse multiplication method.\n",
      " |  \n",
      " |  __rsub__(self, a)\n",
      " |      Implementation of reverse subtraction method.\n",
      " |  \n",
      " |  __rtruediv__(self, a)\n",
      " |      Implementation of reverse division method.\n",
      " |  \n",
      " |  __str__(self)\n",
      " |      String representation of a GeometryEntity.\n",
      " |  \n",
      " |  encloses(self, o)\n",
      " |      Return True if o is inside (not on or outside) the boundaries of self.\n",
      " |      \n",
      " |      The object will be decomposed into Points and individual Entities need\n",
      " |      only define an encloses_point method for their class.\n",
      " |      \n",
      " |      See Also\n",
      " |      ========\n",
      " |      \n",
      " |      sympy.geometry.ellipse.Ellipse.encloses_point\n",
      " |      sympy.geometry.polygon.Polygon.encloses_point\n",
      " |      \n",
      " |      Examples\n",
      " |      ========\n",
      " |      \n",
      " |      >>> from sympy import RegularPolygon, Point, Polygon\n",
      " |      >>> t  = Polygon(*RegularPolygon(Point(0, 0), 1, 3).vertices)\n",
      " |      >>> t2 = Polygon(*RegularPolygon(Point(0, 0), 2, 3).vertices)\n",
      " |      >>> t2.encloses(t)\n",
      " |      True\n",
      " |      >>> t.encloses(t2)\n",
      " |      False\n",
      " |  \n",
      " |  equals(self, o)\n",
      " |  \n",
      " |  is_similar(self, other)\n",
      " |      Is this geometrical entity similar to another geometrical entity?\n",
      " |      \n",
      " |      Two entities are similar if a uniform scaling (enlarging or\n",
      " |      shrinking) of one of the entities will allow one to obtain the other.\n",
      " |      \n",
      " |      Notes\n",
      " |      =====\n",
      " |      \n",
      " |      This method is not intended to be used directly but rather\n",
      " |      through the `are_similar` function found in util.py.\n",
      " |      An entity is not required to implement this method.\n",
      " |      If two different types of entities can be similar, it is only\n",
      " |      required that one of them be able to determine this.\n",
      " |      \n",
      " |      See Also\n",
      " |      ========\n",
      " |      \n",
      " |      scale\n",
      " |  \n",
      " |  parameter_value(self, other, t)\n",
      " |      Return the parameter corresponding to the given point.\n",
      " |      Evaluating an arbitrary point of the entity at this parameter\n",
      " |      value will return the given point.\n",
      " |      \n",
      " |      Examples\n",
      " |      ========\n",
      " |      \n",
      " |      >>> from sympy import Line, Point\n",
      " |      >>> from sympy.abc import t\n",
      " |      >>> a = Point(0, 0)\n",
      " |      >>> b = Point(2, 2)\n",
      " |      >>> Line(a, b).parameter_value((1, 1), t)\n",
      " |      {t: 1/2}\n",
      " |      >>> Line(a, b).arbitrary_point(t).subs(_)\n",
      " |      Point2D(1, 1)\n",
      " |  \n",
      " |  translate(self, x=0, y=0)\n",
      " |      Shift the object by adding to the x,y-coordinates the values x and y.\n",
      " |      \n",
      " |      See Also\n",
      " |      ========\n",
      " |      \n",
      " |      rotate, scale\n",
      " |      \n",
      " |      Examples\n",
      " |      ========\n",
      " |      \n",
      " |      >>> from sympy import RegularPolygon, Point, Polygon\n",
      " |      >>> t = Polygon(*RegularPolygon(Point(0, 0), 1, 3).vertices)\n",
      " |      >>> t\n",
      " |      Triangle(Point2D(1, 0), Point2D(-1/2, sqrt(3)/2), Point2D(-1/2, -sqrt(3)/2))\n",
      " |      >>> t.translate(2)\n",
      " |      Triangle(Point2D(3, 0), Point2D(3/2, sqrt(3)/2), Point2D(3/2, -sqrt(3)/2))\n",
      " |      >>> t.translate(2, 2)\n",
      " |      Triangle(Point2D(3, 2), Point2D(3/2, sqrt(3)/2 + 2), Point2D(3/2, 2 - sqrt(3)/2))\n",
      " |  \n",
      " |  ----------------------------------------------------------------------\n",
      " |  Methods inherited from sympy.sets.sets.Set:\n",
      " |  \n",
      " |  __add__(self, other)\n",
      " |  \n",
      " |  __and__(self, other)\n",
      " |  \n",
      " |  __mul__(self, other)\n",
      " |  \n",
      " |  __or__(self, other)\n",
      " |  \n",
      " |  __pow__(self, exp)\n",
      " |  \n",
      " |  __sub__(self, other)\n",
      " |  \n",
      " |  __xor__(self, other)\n",
      " |  \n",
      " |  complement(self, universe)\n",
      " |      The complement of 'self' w.r.t the given universe.\n",
      " |      \n",
      " |      Examples\n",
      " |      ========\n",
      " |      \n",
      " |      >>> from sympy import Interval, S\n",
      " |      >>> Interval(0, 1).complement(S.Reals)\n",
      " |      Union(Interval.open(-oo, 0), Interval.open(1, oo))\n",
      " |      \n",
      " |      >>> Interval(0, 1).complement(S.UniversalSet)\n",
      " |      Complement(UniversalSet, Interval(0, 1))\n",
      " |  \n",
      " |  contains(self, other)\n",
      " |      Returns a SymPy value indicating whether ``other`` is contained\n",
      " |      in ``self``: ``true`` if it is, ``false`` if it is not, else\n",
      " |      an unevaluated ``Contains`` expression (or, as in the case of\n",
      " |      ConditionSet and a union of FiniteSet/Intervals, an expression\n",
      " |      indicating the conditions for containment).\n",
      " |      \n",
      " |      Examples\n",
      " |      ========\n",
      " |      \n",
      " |      >>> from sympy import Interval, S\n",
      " |      >>> from sympy.abc import x\n",
      " |      \n",
      " |      >>> Interval(0, 1).contains(0.5)\n",
      " |      True\n",
      " |      \n",
      " |      As a shortcut it is possible to use the ``in`` operator, but that\n",
      " |      will raise an error unless an affirmative true or false is not\n",
      " |      obtained.\n",
      " |      \n",
      " |      >>> Interval(0, 1).contains(x)\n",
      " |      (0 <= x) & (x <= 1)\n",
      " |      >>> x in Interval(0, 1)\n",
      " |      Traceback (most recent call last):\n",
      " |      ...\n",
      " |      TypeError: did not evaluate to a bool: None\n",
      " |      \n",
      " |      The result of 'in' is a bool, not a SymPy value\n",
      " |      \n",
      " |      >>> 1 in Interval(0, 2)\n",
      " |      True\n",
      " |      >>> _ is S.true\n",
      " |      False\n",
      " |  \n",
      " |  intersect(self, other)\n",
      " |      Returns the intersection of 'self' and 'other'.\n",
      " |      \n",
      " |      Examples\n",
      " |      ========\n",
      " |      \n",
      " |      >>> from sympy import Interval\n",
      " |      \n",
      " |      >>> Interval(1, 3).intersect(Interval(1, 2))\n",
      " |      Interval(1, 2)\n",
      " |      \n",
      " |      >>> from sympy import imageset, Lambda, symbols, S\n",
      " |      >>> n, m = symbols('n m')\n",
      " |      >>> a = imageset(Lambda(n, 2*n), S.Integers)\n",
      " |      >>> a.intersect(imageset(Lambda(m, 2*m + 1), S.Integers))\n",
      " |      EmptySet\n",
      " |  \n",
      " |  is_disjoint(self, other)\n",
      " |      Returns True if ``self`` and ``other`` are disjoint.\n",
      " |      \n",
      " |      Examples\n",
      " |      ========\n",
      " |      \n",
      " |      >>> from sympy import Interval\n",
      " |      >>> Interval(0, 2).is_disjoint(Interval(1, 2))\n",
      " |      False\n",
      " |      >>> Interval(0, 2).is_disjoint(Interval(3, 4))\n",
      " |      True\n",
      " |      \n",
      " |      References\n",
      " |      ==========\n",
      " |      \n",
      " |      .. [1] https://en.wikipedia.org/wiki/Disjoint_sets\n",
      " |  \n",
      " |  is_proper_subset(self, other)\n",
      " |      Returns True if ``self`` is a proper subset of ``other``.\n",
      " |      \n",
      " |      Examples\n",
      " |      ========\n",
      " |      \n",
      " |      >>> from sympy import Interval\n",
      " |      >>> Interval(0, 0.5).is_proper_subset(Interval(0, 1))\n",
      " |      True\n",
      " |      >>> Interval(0, 1).is_proper_subset(Interval(0, 1))\n",
      " |      False\n",
      " |  \n",
      " |  is_proper_superset(self, other)\n",
      " |      Returns True if ``self`` is a proper superset of ``other``.\n",
      " |      \n",
      " |      Examples\n",
      " |      ========\n",
      " |      \n",
      " |      >>> from sympy import Interval\n",
      " |      >>> Interval(0, 1).is_proper_superset(Interval(0, 0.5))\n",
      " |      True\n",
      " |      >>> Interval(0, 1).is_proper_superset(Interval(0, 1))\n",
      " |      False\n",
      " |  \n",
      " |  is_subset(self, other)\n",
      " |      Returns True if ``self`` is a subset of ``other``.\n",
      " |      \n",
      " |      Examples\n",
      " |      ========\n",
      " |      \n",
      " |      >>> from sympy import Interval\n",
      " |      >>> Interval(0, 0.5).is_subset(Interval(0, 1))\n",
      " |      True\n",
      " |      >>> Interval(0, 1).is_subset(Interval(0, 1, left_open=True))\n",
      " |      False\n",
      " |  \n",
      " |  is_superset(self, other)\n",
      " |      Returns True if ``self`` is a superset of ``other``.\n",
      " |      \n",
      " |      Examples\n",
      " |      ========\n",
      " |      \n",
      " |      >>> from sympy import Interval\n",
      " |      >>> Interval(0, 0.5).is_superset(Interval(0, 1))\n",
      " |      False\n",
      " |      >>> Interval(0, 1).is_superset(Interval(0, 1, left_open=True))\n",
      " |      True\n",
      " |  \n",
      " |  isdisjoint(self, other)\n",
      " |      Alias for :meth:`is_disjoint()`\n",
      " |  \n",
      " |  issubset(self, other)\n",
      " |      Alias for :meth:`is_subset()`\n",
      " |  \n",
      " |  issuperset(self, other)\n",
      " |      Alias for :meth:`is_superset()`\n",
      " |  \n",
      " |  powerset(self)\n",
      " |      Find the Power set of ``self``.\n",
      " |      \n",
      " |      Examples\n",
      " |      ========\n",
      " |      \n",
      " |      >>> from sympy import EmptySet, FiniteSet, Interval\n",
      " |      \n",
      " |      A power set of an empty set:\n",
      " |      \n",
      " |      >>> A = EmptySet\n",
      " |      >>> A.powerset()\n",
      " |      {EmptySet}\n",
      " |      \n",
      " |      A power set of a finite set:\n",
      " |      \n",
      " |      >>> A = FiniteSet(1, 2)\n",
      " |      >>> a, b, c = FiniteSet(1), FiniteSet(2), FiniteSet(1, 2)\n",
      " |      >>> A.powerset() == FiniteSet(a, b, c, EmptySet)\n",
      " |      True\n",
      " |      \n",
      " |      A power set of an interval:\n",
      " |      \n",
      " |      >>> Interval(1, 2).powerset()\n",
      " |      PowerSet(Interval(1, 2))\n",
      " |      \n",
      " |      References\n",
      " |      ==========\n",
      " |      \n",
      " |      .. [1] https://en.wikipedia.org/wiki/Power_set\n",
      " |  \n",
      " |  symmetric_difference(self, other)\n",
      " |      Returns symmetric difference of ``self`` and ``other``.\n",
      " |      \n",
      " |      Examples\n",
      " |      ========\n",
      " |      \n",
      " |      >>> from sympy import Interval, S\n",
      " |      >>> Interval(1, 3).symmetric_difference(S.Reals)\n",
      " |      Union(Interval.open(-oo, 1), Interval.open(3, oo))\n",
      " |      >>> Interval(1, 10).symmetric_difference(S.Reals)\n",
      " |      Union(Interval.open(-oo, 1), Interval.open(10, oo))\n",
      " |      \n",
      " |      >>> from sympy import S, EmptySet\n",
      " |      >>> S.Reals.symmetric_difference(EmptySet)\n",
      " |      Reals\n",
      " |      \n",
      " |      References\n",
      " |      ==========\n",
      " |      .. [1] https://en.wikipedia.org/wiki/Symmetric_difference\n",
      " |  \n",
      " |  union(self, other)\n",
      " |      Returns the union of ``self`` and ``other``.\n",
      " |      \n",
      " |      Examples\n",
      " |      ========\n",
      " |      \n",
      " |      As a shortcut it is possible to use the ``+`` operator:\n",
      " |      \n",
      " |      >>> from sympy import Interval, FiniteSet\n",
      " |      >>> Interval(0, 1).union(Interval(2, 3))\n",
      " |      Union(Interval(0, 1), Interval(2, 3))\n",
      " |      >>> Interval(0, 1) + Interval(2, 3)\n",
      " |      Union(Interval(0, 1), Interval(2, 3))\n",
      " |      >>> Interval(1, 2, True, True) + FiniteSet(2, 3)\n",
      " |      Union({3}, Interval.Lopen(1, 2))\n",
      " |      \n",
      " |      Similarly it is possible to use the ``-`` operator for set differences:\n",
      " |      \n",
      " |      >>> Interval(0, 2) - Interval(0, 1)\n",
      " |      Interval.Lopen(1, 2)\n",
      " |      >>> Interval(1, 3) - FiniteSet(2)\n",
      " |      Union(Interval.Ropen(1, 2), Interval.Lopen(2, 3))\n",
      " |  \n",
      " |  ----------------------------------------------------------------------\n",
      " |  Readonly properties inherited from sympy.sets.sets.Set:\n",
      " |  \n",
      " |  boundary\n",
      " |      The boundary or frontier of a set.\n",
      " |      \n",
      " |      Explanation\n",
      " |      ===========\n",
      " |      \n",
      " |      A point x is on the boundary of a set S if\n",
      " |      \n",
      " |      1.  x is in the closure of S.\n",
      " |          I.e. Every neighborhood of x contains a point in S.\n",
      " |      2.  x is not in the interior of S.\n",
      " |          I.e. There does not exist an open set centered on x contained\n",
      " |          entirely within S.\n",
      " |      \n",
      " |      There are the points on the outer rim of S.  If S is open then these\n",
      " |      points need not actually be contained within S.\n",
      " |      \n",
      " |      For example, the boundary of an interval is its start and end points.\n",
      " |      This is true regardless of whether or not the interval is open.\n",
      " |      \n",
      " |      Examples\n",
      " |      ========\n",
      " |      \n",
      " |      >>> from sympy import Interval\n",
      " |      >>> Interval(0, 1).boundary\n",
      " |      {0, 1}\n",
      " |      >>> Interval(0, 1, True, False).boundary\n",
      " |      {0, 1}\n",
      " |  \n",
      " |  closure\n",
      " |      Property method which returns the closure of a set.\n",
      " |      The closure is defined as the union of the set itself and its\n",
      " |      boundary.\n",
      " |      \n",
      " |      Examples\n",
      " |      ========\n",
      " |      >>> from sympy import S, Interval\n",
      " |      >>> S.Reals.closure\n",
      " |      Reals\n",
      " |      >>> Interval(0, 1).closure\n",
      " |      Interval(0, 1)\n",
      " |  \n",
      " |  inf\n",
      " |      The infimum of ``self``.\n",
      " |      \n",
      " |      Examples\n",
      " |      ========\n",
      " |      \n",
      " |      >>> from sympy import Interval, Union\n",
      " |      >>> Interval(0, 1).inf\n",
      " |      0\n",
      " |      >>> Union(Interval(0, 1), Interval(2, 3)).inf\n",
      " |      0\n",
      " |  \n",
      " |  interior\n",
      " |      Property method which returns the interior of a set.\n",
      " |      The interior of a set S consists all points of S that do not\n",
      " |      belong to the boundary of S.\n",
      " |      \n",
      " |      Examples\n",
      " |      ========\n",
      " |      >>> from sympy import Interval\n",
      " |      >>> Interval(0, 1).interior\n",
      " |      Interval.open(0, 1)\n",
      " |      >>> Interval(0, 1).boundary.interior\n",
      " |      EmptySet\n",
      " |  \n",
      " |  is_EmptySet\n",
      " |  \n",
      " |  is_closed\n",
      " |      A property method to check whether a set is closed.\n",
      " |      \n",
      " |      Explanation\n",
      " |      ===========\n",
      " |      \n",
      " |      A set is closed if its complement is an open set. The closedness of a\n",
      " |      subset of the reals is determined with respect to R and its standard\n",
      " |      topology.\n",
      " |      \n",
      " |      Examples\n",
      " |      ========\n",
      " |      >>> from sympy import Interval\n",
      " |      >>> Interval(0, 1).is_closed\n",
      " |      True\n",
      " |  \n",
      " |  is_open\n",
      " |      Property method to check whether a set is open.\n",
      " |      \n",
      " |      Explanation\n",
      " |      ===========\n",
      " |      \n",
      " |      A set is open if and only if it has an empty intersection with its\n",
      " |      boundary. In particular, a subset A of the reals is open if and only\n",
      " |      if each one of its points is contained in an open interval that is a\n",
      " |      subset of A.\n",
      " |      \n",
      " |      Examples\n",
      " |      ========\n",
      " |      >>> from sympy import S\n",
      " |      >>> S.Reals.is_open\n",
      " |      True\n",
      " |      >>> S.Rationals.is_open\n",
      " |      False\n",
      " |  \n",
      " |  kind\n",
      " |      The kind of a Set\n",
      " |      \n",
      " |      Explanation\n",
      " |      ===========\n",
      " |      \n",
      " |      Any :class:`Set` will have kind :class:`SetKind` which is\n",
      " |      parametrised by the kind of the elements of the set. For example\n",
      " |      most sets are sets of numbers and will have kind\n",
      " |      ``SetKind(NumberKind)``. If elements of sets are different in kind than\n",
      " |      their kind will ``SetKind(UndefinedKind)``. See\n",
      " |      :class:`sympy.core.kind.Kind` for an explanation of the kind system.\n",
      " |      \n",
      " |      Examples\n",
      " |      ========\n",
      " |      \n",
      " |      >>> from sympy import Interval, Matrix, FiniteSet, EmptySet, ProductSet, PowerSet\n",
      " |      \n",
      " |      >>> FiniteSet(Matrix([1, 2])).kind\n",
      " |      SetKind(MatrixKind(NumberKind))\n",
      " |      \n",
      " |      >>> Interval(1, 2).kind\n",
      " |      SetKind(NumberKind)\n",
      " |      \n",
      " |      >>> EmptySet.kind\n",
      " |      SetKind()\n",
      " |      \n",
      " |      A :class:`sympy.sets.powerset.PowerSet` is a set of sets:\n",
      " |      \n",
      " |      >>> PowerSet({1, 2, 3}).kind\n",
      " |      SetKind(SetKind(NumberKind))\n",
      " |      \n",
      " |      A :class:`ProductSet` represents the set of tuples of elements of\n",
      " |      other sets. Its kind is :class:`sympy.core.containers.TupleKind`\n",
      " |      parametrised by the kinds of the elements of those sets:\n",
      " |      \n",
      " |      >>> p = ProductSet(FiniteSet(1, 2), FiniteSet(3, 4))\n",
      " |      >>> list(p)\n",
      " |      [(1, 3), (2, 3), (1, 4), (2, 4)]\n",
      " |      >>> p.kind\n",
      " |      SetKind(TupleKind(NumberKind, NumberKind))\n",
      " |      \n",
      " |      When all elements of the set do not have same kind, the kind\n",
      " |      will be returned as ``SetKind(UndefinedKind)``:\n",
      " |      \n",
      " |      >>> FiniteSet(0, Matrix([1, 2])).kind\n",
      " |      SetKind(UndefinedKind)\n",
      " |      \n",
      " |      The kind of the elements of a set are given by the ``element_kind``\n",
      " |      attribute of ``SetKind``:\n",
      " |      \n",
      " |      >>> Interval(1, 2).kind.element_kind\n",
      " |      NumberKind\n",
      " |      \n",
      " |      See Also\n",
      " |      ========\n",
      " |      \n",
      " |      NumberKind\n",
      " |      sympy.core.kind.UndefinedKind\n",
      " |      sympy.core.containers.TupleKind\n",
      " |      MatrixKind\n",
      " |      sympy.matrices.expressions.sets.MatrixSet\n",
      " |      sympy.sets.conditionset.ConditionSet\n",
      " |      Rationals\n",
      " |      Naturals\n",
      " |      Integers\n",
      " |      sympy.sets.fancysets.ImageSet\n",
      " |      sympy.sets.fancysets.Range\n",
      " |      sympy.sets.fancysets.ComplexRegion\n",
      " |      sympy.sets.powerset.PowerSet\n",
      " |      sympy.sets.sets.ProductSet\n",
      " |      sympy.sets.sets.Interval\n",
      " |      sympy.sets.sets.Union\n",
      " |      sympy.sets.sets.Intersection\n",
      " |      sympy.sets.sets.Complement\n",
      " |      sympy.sets.sets.EmptySet\n",
      " |      sympy.sets.sets.UniversalSet\n",
      " |      sympy.sets.sets.FiniteSet\n",
      " |      sympy.sets.sets.SymmetricDifference\n",
      " |      sympy.sets.sets.DisjointUnion\n",
      " |  \n",
      " |  measure\n",
      " |      The (Lebesgue) measure of ``self``.\n",
      " |      \n",
      " |      Examples\n",
      " |      ========\n",
      " |      \n",
      " |      >>> from sympy import Interval, Union\n",
      " |      >>> Interval(0, 1).measure\n",
      " |      1\n",
      " |      >>> Union(Interval(0, 1), Interval(2, 3)).measure\n",
      " |      2\n",
      " |  \n",
      " |  sup\n",
      " |      The supremum of ``self``.\n",
      " |      \n",
      " |      Examples\n",
      " |      ========\n",
      " |      \n",
      " |      >>> from sympy import Interval, Union\n",
      " |      >>> Interval(0, 1).sup\n",
      " |      1\n",
      " |      >>> Union(Interval(0, 1), Interval(2, 3)).sup\n",
      " |      3\n",
      " |  \n",
      " |  ----------------------------------------------------------------------\n",
      " |  Data and other attributes inherited from sympy.sets.sets.Set:\n",
      " |  \n",
      " |  is_Complement = None\n",
      " |  \n",
      " |  is_ComplexRegion = False\n",
      " |  \n",
      " |  is_FiniteSet = False\n",
      " |  \n",
      " |  is_Intersection = None\n",
      " |  \n",
      " |  is_Interval = False\n",
      " |  \n",
      " |  is_ProductSet = False\n",
      " |  \n",
      " |  is_Union = False\n",
      " |  \n",
      " |  is_UniversalSet = None\n",
      " |  \n",
      " |  is_empty = None\n",
      " |  \n",
      " |  is_finite_set = None\n",
      " |  \n",
      " |  is_interval = False\n",
      " |  \n",
      " |  is_iterable = False\n",
      " |  \n",
      " |  is_number = False\n",
      " |  \n",
      " |  ----------------------------------------------------------------------\n",
      " |  Methods inherited from sympy.core.basic.Basic:\n",
      " |  \n",
      " |  __getstate__(self)\n",
      " |  \n",
      " |  __reduce_ex__(self, protocol)\n",
      " |      Helper for pickle.\n",
      " |  \n",
      " |  __setstate__(self, state)\n",
      " |  \n",
      " |  as_content_primitive(self, radical=False, clear=True)\n",
      " |      A stub to allow Basic args (like Tuple) to be skipped when computing\n",
      " |      the content and primitive components of an expression.\n",
      " |      \n",
      " |      See Also\n",
      " |      ========\n",
      " |      \n",
      " |      sympy.core.expr.Expr.as_content_primitive\n",
      " |  \n",
      " |  as_dummy(self)\n",
      " |      Return the expression with any objects having structurally\n",
      " |      bound symbols replaced with unique, canonical symbols within\n",
      " |      the object in which they appear and having only the default\n",
      " |      assumption for commutativity being True. When applied to a\n",
      " |      symbol a new symbol having only the same commutativity will be\n",
      " |      returned.\n",
      " |      \n",
      " |      Examples\n",
      " |      ========\n",
      " |      \n",
      " |      >>> from sympy import Integral, Symbol\n",
      " |      >>> from sympy.abc import x\n",
      " |      >>> r = Symbol('r', real=True)\n",
      " |      >>> Integral(r, (r, x)).as_dummy()\n",
      " |      Integral(_0, (_0, x))\n",
      " |      >>> _.variables[0].is_real is None\n",
      " |      True\n",
      " |      >>> r.as_dummy()\n",
      " |      _r\n",
      " |      \n",
      " |      Notes\n",
      " |      =====\n",
      " |      \n",
      " |      Any object that has structurally bound variables should have\n",
      " |      a property, `bound_symbols` that returns those symbols\n",
      " |      appearing in the object.\n",
      " |  \n",
      " |  atoms(self, *types)\n",
      " |      Returns the atoms that form the current object.\n",
      " |      \n",
      " |      By default, only objects that are truly atomic and cannot\n",
      " |      be divided into smaller pieces are returned: symbols, numbers,\n",
      " |      and number symbols like I and pi. It is possible to request\n",
      " |      atoms of any type, however, as demonstrated below.\n",
      " |      \n",
      " |      Examples\n",
      " |      ========\n",
      " |      \n",
      " |      >>> from sympy import I, pi, sin\n",
      " |      >>> from sympy.abc import x, y\n",
      " |      >>> (1 + x + 2*sin(y + I*pi)).atoms()\n",
      " |      {1, 2, I, pi, x, y}\n",
      " |      \n",
      " |      If one or more types are given, the results will contain only\n",
      " |      those types of atoms.\n",
      " |      \n",
      " |      >>> from sympy import Number, NumberSymbol, Symbol\n",
      " |      >>> (1 + x + 2*sin(y + I*pi)).atoms(Symbol)\n",
      " |      {x, y}\n",
      " |      \n",
      " |      >>> (1 + x + 2*sin(y + I*pi)).atoms(Number)\n",
      " |      {1, 2}\n",
      " |      \n",
      " |      >>> (1 + x + 2*sin(y + I*pi)).atoms(Number, NumberSymbol)\n",
      " |      {1, 2, pi}\n",
      " |      \n",
      " |      >>> (1 + x + 2*sin(y + I*pi)).atoms(Number, NumberSymbol, I)\n",
      " |      {1, 2, I, pi}\n",
      " |      \n",
      " |      Note that I (imaginary unit) and zoo (complex infinity) are special\n",
      " |      types of number symbols and are not part of the NumberSymbol class.\n",
      " |      \n",
      " |      The type can be given implicitly, too:\n",
      " |      \n",
      " |      >>> (1 + x + 2*sin(y + I*pi)).atoms(x) # x is a Symbol\n",
      " |      {x, y}\n",
      " |      \n",
      " |      Be careful to check your assumptions when using the implicit option\n",
      " |      since ``S(1).is_Integer = True`` but ``type(S(1))`` is ``One``, a special type\n",
      " |      of SymPy atom, while ``type(S(2))`` is type ``Integer`` and will find all\n",
      " |      integers in an expression:\n",
      " |      \n",
      " |      >>> from sympy import S\n",
      " |      >>> (1 + x + 2*sin(y + I*pi)).atoms(S(1))\n",
      " |      {1}\n",
      " |      \n",
      " |      >>> (1 + x + 2*sin(y + I*pi)).atoms(S(2))\n",
      " |      {1, 2}\n",
      " |      \n",
      " |      Finally, arguments to atoms() can select more than atomic atoms: any\n",
      " |      SymPy type (loaded in core/__init__.py) can be listed as an argument\n",
      " |      and those types of \"atoms\" as found in scanning the arguments of the\n",
      " |      expression recursively:\n",
      " |      \n",
      " |      >>> from sympy import Function, Mul\n",
      " |      >>> from sympy.core.function import AppliedUndef\n",
      " |      >>> f = Function('f')\n",
      " |      >>> (1 + f(x) + 2*sin(y + I*pi)).atoms(Function)\n",
      " |      {f(x), sin(y + I*pi)}\n",
      " |      >>> (1 + f(x) + 2*sin(y + I*pi)).atoms(AppliedUndef)\n",
      " |      {f(x)}\n",
      " |      \n",
      " |      >>> (1 + x + 2*sin(y + I*pi)).atoms(Mul)\n",
      " |      {I*pi, 2*sin(y + I*pi)}\n",
      " |  \n",
      " |  compare(self, other)\n",
      " |      Return -1, 0, 1 if the object is smaller, equal, or greater than other.\n",
      " |      \n",
      " |      Not in the mathematical sense. If the object is of a different type\n",
      " |      from the \"other\" then their classes are ordered according to\n",
      " |      the sorted_classes list.\n",
      " |      \n",
      " |      Examples\n",
      " |      ========\n",
      " |      \n",
      " |      >>> from sympy.abc import x, y\n",
      " |      >>> x.compare(y)\n",
      " |      -1\n",
      " |      >>> x.compare(x)\n",
      " |      0\n",
      " |      >>> y.compare(x)\n",
      " |      1\n",
      " |  \n",
      " |  copy(self)\n",
      " |  \n",
      " |  could_extract_minus_sign(self)\n",
      " |  \n",
      " |  count(self, query)\n",
      " |      Count the number of matching subexpressions.\n",
      " |  \n",
      " |  count_ops(self, visual=None)\n",
      " |      wrapper for count_ops that returns the operation count.\n",
      " |  \n",
      " |  doit(self, **hints)\n",
      " |      Evaluate objects that are not evaluated by default like limits,\n",
      " |      integrals, sums and products. All objects of this kind will be\n",
      " |      evaluated recursively, unless some species were excluded via 'hints'\n",
      " |      or unless the 'deep' hint was set to 'False'.\n",
      " |      \n",
      " |      >>> from sympy import Integral\n",
      " |      >>> from sympy.abc import x\n",
      " |      \n",
      " |      >>> 2*Integral(x, x)\n",
      " |      2*Integral(x, x)\n",
      " |      \n",
      " |      >>> (2*Integral(x, x)).doit()\n",
      " |      x**2\n",
      " |      \n",
      " |      >>> (2*Integral(x, x)).doit(deep=False)\n",
      " |      2*Integral(x, x)\n",
      " |  \n",
      " |  dummy_eq(self, other, symbol=None)\n",
      " |      Compare two expressions and handle dummy symbols.\n",
      " |      \n",
      " |      Examples\n",
      " |      ========\n",
      " |      \n",
      " |      >>> from sympy import Dummy\n",
      " |      >>> from sympy.abc import x, y\n",
      " |      \n",
      " |      >>> u = Dummy('u')\n",
      " |      \n",
      " |      >>> (u**2 + 1).dummy_eq(x**2 + 1)\n",
      " |      True\n",
      " |      >>> (u**2 + 1) == (x**2 + 1)\n",
      " |      False\n",
      " |      \n",
      " |      >>> (u**2 + y).dummy_eq(x**2 + y, x)\n",
      " |      True\n",
      " |      >>> (u**2 + y).dummy_eq(x**2 + y, y)\n",
      " |      False\n",
      " |  \n",
      " |  find(self, query, group=False)\n",
      " |      Find all subexpressions matching a query.\n",
      " |  \n",
      " |  has(self, *patterns)\n",
      " |      Test whether any subexpression matches any of the patterns.\n",
      " |      \n",
      " |      Examples\n",
      " |      ========\n",
      " |      \n",
      " |      >>> from sympy import sin\n",
      " |      >>> from sympy.abc import x, y, z\n",
      " |      >>> (x**2 + sin(x*y)).has(z)\n",
      " |      False\n",
      " |      >>> (x**2 + sin(x*y)).has(x, y, z)\n",
      " |      True\n",
      " |      >>> x.has(x)\n",
      " |      True\n",
      " |      \n",
      " |      Note ``has`` is a structural algorithm with no knowledge of\n",
      " |      mathematics. Consider the following half-open interval:\n",
      " |      \n",
      " |      >>> from sympy import Interval\n",
      " |      >>> i = Interval.Lopen(0, 5); i\n",
      " |      Interval.Lopen(0, 5)\n",
      " |      >>> i.args\n",
      " |      (0, 5, True, False)\n",
      " |      >>> i.has(4)  # there is no \"4\" in the arguments\n",
      " |      False\n",
      " |      >>> i.has(0)  # there *is* a \"0\" in the arguments\n",
      " |      True\n",
      " |      \n",
      " |      Instead, use ``contains`` to determine whether a number is in the\n",
      " |      interval or not:\n",
      " |      \n",
      " |      >>> i.contains(4)\n",
      " |      True\n",
      " |      >>> i.contains(0)\n",
      " |      False\n",
      " |      \n",
      " |      \n",
      " |      Note that ``expr.has(*patterns)`` is exactly equivalent to\n",
      " |      ``any(expr.has(p) for p in patterns)``. In particular, ``False`` is\n",
      " |      returned when the list of patterns is empty.\n",
      " |      \n",
      " |      >>> x.has()\n",
      " |      False\n",
      " |  \n",
      " |  has_free(self, *patterns)\n",
      " |      return True if self has object(s) ``x`` as a free expression\n",
      " |      else False.\n",
      " |      \n",
      " |      Examples\n",
      " |      ========\n",
      " |      \n",
      " |      >>> from sympy import Integral, Function\n",
      " |      >>> from sympy.abc import x, y\n",
      " |      >>> f = Function('f')\n",
      " |      >>> g = Function('g')\n",
      " |      >>> expr = Integral(f(x), (f(x), 1, g(y)))\n",
      " |      >>> expr.free_symbols\n",
      " |      {y}\n",
      " |      >>> expr.has_free(g(y))\n",
      " |      True\n",
      " |      >>> expr.has_free(*(x, f(x)))\n",
      " |      False\n",
      " |      \n",
      " |      This works for subexpressions and types, too:\n",
      " |      \n",
      " |      >>> expr.has_free(g)\n",
      " |      True\n",
      " |      >>> (x + y + 1).has_free(y + 1)\n",
      " |      True\n",
      " |  \n",
      " |  is_hypergeometric(self, k)\n",
      " |  \n",
      " |  match(self, pattern, old=False)\n",
      " |      Pattern matching.\n",
      " |      \n",
      " |      Wild symbols match all.\n",
      " |      \n",
      " |      Return ``None`` when expression (self) does not match\n",
      " |      with pattern. Otherwise return a dictionary such that::\n",
      " |      \n",
      " |        pattern.xreplace(self.match(pattern)) == self\n",
      " |      \n",
      " |      Examples\n",
      " |      ========\n",
      " |      \n",
      " |      >>> from sympy import Wild, Sum\n",
      " |      >>> from sympy.abc import x, y\n",
      " |      >>> p = Wild(\"p\")\n",
      " |      >>> q = Wild(\"q\")\n",
      " |      >>> r = Wild(\"r\")\n",
      " |      >>> e = (x+y)**(x+y)\n",
      " |      >>> e.match(p**p)\n",
      " |      {p_: x + y}\n",
      " |      >>> e.match(p**q)\n",
      " |      {p_: x + y, q_: x + y}\n",
      " |      >>> e = (2*x)**2\n",
      " |      >>> e.match(p*q**r)\n",
      " |      {p_: 4, q_: x, r_: 2}\n",
      " |      >>> (p*q**r).xreplace(e.match(p*q**r))\n",
      " |      4*x**2\n",
      " |      \n",
      " |      Structurally bound symbols are ignored during matching:\n",
      " |      \n",
      " |      >>> Sum(x, (x, 1, 2)).match(Sum(y, (y, 1, p)))\n",
      " |      {p_: 2}\n",
      " |      \n",
      " |      But they can be identified if desired:\n",
      " |      \n",
      " |      >>> Sum(x, (x, 1, 2)).match(Sum(q, (q, 1, p)))\n",
      " |      {p_: 2, q_: x}\n",
      " |      \n",
      " |      The ``old`` flag will give the old-style pattern matching where\n",
      " |      expressions and patterns are essentially solved to give the\n",
      " |      match. Both of the following give None unless ``old=True``:\n",
      " |      \n",
      " |      >>> (x - 2).match(p - x, old=True)\n",
      " |      {p_: 2*x - 2}\n",
      " |      >>> (2/x).match(p*x, old=True)\n",
      " |      {p_: 2/x**2}\n",
      " |  \n",
      " |  matches(self, expr, repl_dict=None, old=False)\n",
      " |      Helper method for match() that looks for a match between Wild symbols\n",
      " |      in self and expressions in expr.\n",
      " |      \n",
      " |      Examples\n",
      " |      ========\n",
      " |      \n",
      " |      >>> from sympy import symbols, Wild, Basic\n",
      " |      >>> a, b, c = symbols('a b c')\n",
      " |      >>> x = Wild('x')\n",
      " |      >>> Basic(a + x, x).matches(Basic(a + b, c)) is None\n",
      " |      True\n",
      " |      >>> Basic(a + x, x).matches(Basic(a + b + c, b + c))\n",
      " |      {x_: b + c}\n",
      " |  \n",
      " |  rcall(self, *args)\n",
      " |      Apply on the argument recursively through the expression tree.\n",
      " |      \n",
      " |      This method is used to simulate a common abuse of notation for\n",
      " |      operators. For instance, in SymPy the following will not work:\n",
      " |      \n",
      " |      ``(x+Lambda(y, 2*y))(z) == x+2*z``,\n",
      " |      \n",
      " |      however, you can use:\n",
      " |      \n",
      " |      >>> from sympy import Lambda\n",
      " |      >>> from sympy.abc import x, y, z\n",
      " |      >>> (x + Lambda(y, 2*y)).rcall(z)\n",
      " |      x + 2*z\n",
      " |  \n",
      " |  refine(self, assumption=True)\n",
      " |      See the refine function in sympy.assumptions\n",
      " |  \n",
      " |  replace(self, query, value, map=False, simultaneous=True, exact=None)\n",
      " |      Replace matching subexpressions of ``self`` with ``value``.\n",
      " |      \n",
      " |      If ``map = True`` then also return the mapping {old: new} where ``old``\n",
      " |      was a sub-expression found with query and ``new`` is the replacement\n",
      " |      value for it. If the expression itself does not match the query, then\n",
      " |      the returned value will be ``self.xreplace(map)`` otherwise it should\n",
      " |      be ``self.subs(ordered(map.items()))``.\n",
      " |      \n",
      " |      Traverses an expression tree and performs replacement of matching\n",
      " |      subexpressions from the bottom to the top of the tree. The default\n",
      " |      approach is to do the replacement in a simultaneous fashion so\n",
      " |      changes made are targeted only once. If this is not desired or causes\n",
      " |      problems, ``simultaneous`` can be set to False.\n",
      " |      \n",
      " |      In addition, if an expression containing more than one Wild symbol\n",
      " |      is being used to match subexpressions and the ``exact`` flag is None\n",
      " |      it will be set to True so the match will only succeed if all non-zero\n",
      " |      values are received for each Wild that appears in the match pattern.\n",
      " |      Setting this to False accepts a match of 0; while setting it True\n",
      " |      accepts all matches that have a 0 in them. See example below for\n",
      " |      cautions.\n",
      " |      \n",
      " |      The list of possible combinations of queries and replacement values\n",
      " |      is listed below:\n",
      " |      \n",
      " |      Examples\n",
      " |      ========\n",
      " |      \n",
      " |      Initial setup\n",
      " |      \n",
      " |      >>> from sympy import log, sin, cos, tan, Wild, Mul, Add\n",
      " |      >>> from sympy.abc import x, y\n",
      " |      >>> f = log(sin(x)) + tan(sin(x**2))\n",
      " |      \n",
      " |      1.1. type -> type\n",
      " |          obj.replace(type, newtype)\n",
      " |      \n",
      " |          When object of type ``type`` is found, replace it with the\n",
      " |          result of passing its argument(s) to ``newtype``.\n",
      " |      \n",
      " |          >>> f.replace(sin, cos)\n",
      " |          log(cos(x)) + tan(cos(x**2))\n",
      " |          >>> sin(x).replace(sin, cos, map=True)\n",
      " |          (cos(x), {sin(x): cos(x)})\n",
      " |          >>> (x*y).replace(Mul, Add)\n",
      " |          x + y\n",
      " |      \n",
      " |      1.2. type -> func\n",
      " |          obj.replace(type, func)\n",
      " |      \n",
      " |          When object of type ``type`` is found, apply ``func`` to its\n",
      " |          argument(s). ``func`` must be written to handle the number\n",
      " |          of arguments of ``type``.\n",
      " |      \n",
      " |          >>> f.replace(sin, lambda arg: sin(2*arg))\n",
      " |          log(sin(2*x)) + tan(sin(2*x**2))\n",
      " |          >>> (x*y).replace(Mul, lambda *args: sin(2*Mul(*args)))\n",
      " |          sin(2*x*y)\n",
      " |      \n",
      " |      2.1. pattern -> expr\n",
      " |          obj.replace(pattern(wild), expr(wild))\n",
      " |      \n",
      " |          Replace subexpressions matching ``pattern`` with the expression\n",
      " |          written in terms of the Wild symbols in ``pattern``.\n",
      " |      \n",
      " |          >>> a, b = map(Wild, 'ab')\n",
      " |          >>> f.replace(sin(a), tan(a))\n",
      " |          log(tan(x)) + tan(tan(x**2))\n",
      " |          >>> f.replace(sin(a), tan(a/2))\n",
      " |          log(tan(x/2)) + tan(tan(x**2/2))\n",
      " |          >>> f.replace(sin(a), a)\n",
      " |          log(x) + tan(x**2)\n",
      " |          >>> (x*y).replace(a*x, a)\n",
      " |          y\n",
      " |      \n",
      " |          Matching is exact by default when more than one Wild symbol\n",
      " |          is used: matching fails unless the match gives non-zero\n",
      " |          values for all Wild symbols:\n",
      " |      \n",
      " |          >>> (2*x + y).replace(a*x + b, b - a)\n",
      " |          y - 2\n",
      " |          >>> (2*x).replace(a*x + b, b - a)\n",
      " |          2*x\n",
      " |      \n",
      " |          When set to False, the results may be non-intuitive:\n",
      " |      \n",
      " |          >>> (2*x).replace(a*x + b, b - a, exact=False)\n",
      " |          2/x\n",
      " |      \n",
      " |      2.2. pattern -> func\n",
      " |          obj.replace(pattern(wild), lambda wild: expr(wild))\n",
      " |      \n",
      " |          All behavior is the same as in 2.1 but now a function in terms of\n",
      " |          pattern variables is used rather than an expression:\n",
      " |      \n",
      " |          >>> f.replace(sin(a), lambda a: sin(2*a))\n",
      " |          log(sin(2*x)) + tan(sin(2*x**2))\n",
      " |      \n",
      " |      3.1. func -> func\n",
      " |          obj.replace(filter, func)\n",
      " |      \n",
      " |          Replace subexpression ``e`` with ``func(e)`` if ``filter(e)``\n",
      " |          is True.\n",
      " |      \n",
      " |          >>> g = 2*sin(x**3)\n",
      " |          >>> g.replace(lambda expr: expr.is_Number, lambda expr: expr**2)\n",
      " |          4*sin(x**9)\n",
      " |      \n",
      " |      The expression itself is also targeted by the query but is done in\n",
      " |      such a fashion that changes are not made twice.\n",
      " |      \n",
      " |          >>> e = x*(x*y + 1)\n",
      " |          >>> e.replace(lambda x: x.is_Mul, lambda x: 2*x)\n",
      " |          2*x*(2*x*y + 1)\n",
      " |      \n",
      " |      When matching a single symbol, `exact` will default to True, but\n",
      " |      this may or may not be the behavior that is desired:\n",
      " |      \n",
      " |      Here, we want `exact=False`:\n",
      " |      \n",
      " |      >>> from sympy import Function\n",
      " |      >>> f = Function('f')\n",
      " |      >>> e = f(1) + f(0)\n",
      " |      >>> q = f(a), lambda a: f(a + 1)\n",
      " |      >>> e.replace(*q, exact=False)\n",
      " |      f(1) + f(2)\n",
      " |      >>> e.replace(*q, exact=True)\n",
      " |      f(0) + f(2)\n",
      " |      \n",
      " |      But here, the nature of matching makes selecting\n",
      " |      the right setting tricky:\n",
      " |      \n",
      " |      >>> e = x**(1 + y)\n",
      " |      >>> (x**(1 + y)).replace(x**(1 + a), lambda a: x**-a, exact=False)\n",
      " |      x\n",
      " |      >>> (x**(1 + y)).replace(x**(1 + a), lambda a: x**-a, exact=True)\n",
      " |      x**(-x - y + 1)\n",
      " |      >>> (x**y).replace(x**(1 + a), lambda a: x**-a, exact=False)\n",
      " |      x\n",
      " |      >>> (x**y).replace(x**(1 + a), lambda a: x**-a, exact=True)\n",
      " |      x**(1 - y)\n",
      " |      \n",
      " |      It is probably better to use a different form of the query\n",
      " |      that describes the target expression more precisely:\n",
      " |      \n",
      " |      >>> (1 + x**(1 + y)).replace(\n",
      " |      ... lambda x: x.is_Pow and x.exp.is_Add and x.exp.args[0] == 1,\n",
      " |      ... lambda x: x.base**(1 - (x.exp - 1)))\n",
      " |      ...\n",
      " |      x**(1 - y) + 1\n",
      " |      \n",
      " |      See Also\n",
      " |      ========\n",
      " |      \n",
      " |      subs: substitution of subexpressions as defined by the objects\n",
      " |            themselves.\n",
      " |      xreplace: exact node replacement in expr tree; also capable of\n",
      " |                using matching rules\n",
      " |  \n",
      " |  rewrite(self, *args, deep=True, **hints)\n",
      " |      Rewrite *self* using a defined rule.\n",
      " |      \n",
      " |      Rewriting transforms an expression to another, which is mathematically\n",
      " |      equivalent but structurally different. For example you can rewrite\n",
      " |      trigonometric functions as complex exponentials or combinatorial\n",
      " |      functions as gamma function.\n",
      " |      \n",
      " |      This method takes a *pattern* and a *rule* as positional arguments.\n",
      " |      *pattern* is optional parameter which defines the types of expressions\n",
      " |      that will be transformed. If it is not passed, all possible expressions\n",
      " |      will be rewritten. *rule* defines how the expression will be rewritten.\n",
      " |      \n",
      " |      Parameters\n",
      " |      ==========\n",
      " |      \n",
      " |      args : *rule*, or *pattern* and *rule*.\n",
      " |          - *pattern* is a type or an iterable of types.\n",
      " |          - *rule* can be any object.\n",
      " |      \n",
      " |      deep : bool, optional.\n",
      " |          If ``True``, subexpressions are recursively transformed. Default is\n",
      " |          ``True``.\n",
      " |      \n",
      " |      Examples\n",
      " |      ========\n",
      " |      \n",
      " |      If *pattern* is unspecified, all possible expressions are transformed.\n",
      " |      \n",
      " |      >>> from sympy import cos, sin, exp, I\n",
      " |      >>> from sympy.abc import x\n",
      " |      >>> expr = cos(x) + I*sin(x)\n",
      " |      >>> expr.rewrite(exp)\n",
      " |      exp(I*x)\n",
      " |      \n",
      " |      Pattern can be a type or an iterable of types.\n",
      " |      \n",
      " |      >>> expr.rewrite(sin, exp)\n",
      " |      exp(I*x)/2 + cos(x) - exp(-I*x)/2\n",
      " |      >>> expr.rewrite([cos,], exp)\n",
      " |      exp(I*x)/2 + I*sin(x) + exp(-I*x)/2\n",
      " |      >>> expr.rewrite([cos, sin], exp)\n",
      " |      exp(I*x)\n",
      " |      \n",
      " |      Rewriting behavior can be implemented by defining ``_eval_rewrite()``\n",
      " |      method.\n",
      " |      \n",
      " |      >>> from sympy import Expr, sqrt, pi\n",
      " |      >>> class MySin(Expr):\n",
      " |      ...     def _eval_rewrite(self, rule, args, **hints):\n",
      " |      ...         x, = args\n",
      " |      ...         if rule == cos:\n",
      " |      ...             return cos(pi/2 - x, evaluate=False)\n",
      " |      ...         if rule == sqrt:\n",
      " |      ...             return sqrt(1 - cos(x)**2)\n",
      " |      >>> MySin(MySin(x)).rewrite(cos)\n",
      " |      cos(-cos(-x + pi/2) + pi/2)\n",
      " |      >>> MySin(x).rewrite(sqrt)\n",
      " |      sqrt(1 - cos(x)**2)\n",
      " |      \n",
      " |      Defining ``_eval_rewrite_as_[...]()`` method is supported for backwards\n",
      " |      compatibility reason. This may be removed in the future and using it is\n",
      " |      discouraged.\n",
      " |      \n",
      " |      >>> class MySin(Expr):\n",
      " |      ...     def _eval_rewrite_as_cos(self, *args, **hints):\n",
      " |      ...         x, = args\n",
      " |      ...         return cos(pi/2 - x, evaluate=False)\n",
      " |      >>> MySin(x).rewrite(cos)\n",
      " |      cos(-x + pi/2)\n",
      " |  \n",
      " |  simplify(self, **kwargs)\n",
      " |      See the simplify function in sympy.simplify\n",
      " |  \n",
      " |  sort_key(self, order=None)\n",
      " |      Return a sort key.\n",
      " |      \n",
      " |      Examples\n",
      " |      ========\n",
      " |      \n",
      " |      >>> from sympy import S, I\n",
      " |      \n",
      " |      >>> sorted([S(1)/2, I, -I], key=lambda x: x.sort_key())\n",
      " |      [1/2, -I, I]\n",
      " |      \n",
      " |      >>> S(\"[x, 1/x, 1/x**2, x**2, x**(1/2), x**(1/4), x**(3/2)]\")\n",
      " |      [x, 1/x, x**(-2), x**2, sqrt(x), x**(1/4), x**(3/2)]\n",
      " |      >>> sorted(_, key=lambda x: x.sort_key())\n",
      " |      [x**(-2), 1/x, x**(1/4), sqrt(x), x, x**(3/2), x**2]\n",
      " |  \n",
      " |  subs(self, *args, **kwargs)\n",
      " |      Substitutes old for new in an expression after sympifying args.\n",
      " |      \n",
      " |      `args` is either:\n",
      " |        - two arguments, e.g. foo.subs(old, new)\n",
      " |        - one iterable argument, e.g. foo.subs(iterable). The iterable may be\n",
      " |           o an iterable container with (old, new) pairs. In this case the\n",
      " |             replacements are processed in the order given with successive\n",
      " |             patterns possibly affecting replacements already made.\n",
      " |           o a dict or set whose key/value items correspond to old/new pairs.\n",
      " |             In this case the old/new pairs will be sorted by op count and in\n",
      " |             case of a tie, by number of args and the default_sort_key. The\n",
      " |             resulting sorted list is then processed as an iterable container\n",
      " |             (see previous).\n",
      " |      \n",
      " |      If the keyword ``simultaneous`` is True, the subexpressions will not be\n",
      " |      evaluated until all the substitutions have been made.\n",
      " |      \n",
      " |      Examples\n",
      " |      ========\n",
      " |      \n",
      " |      >>> from sympy import pi, exp, limit, oo\n",
      " |      >>> from sympy.abc import x, y\n",
      " |      >>> (1 + x*y).subs(x, pi)\n",
      " |      pi*y + 1\n",
      " |      >>> (1 + x*y).subs({x:pi, y:2})\n",
      " |      1 + 2*pi\n",
      " |      >>> (1 + x*y).subs([(x, pi), (y, 2)])\n",
      " |      1 + 2*pi\n",
      " |      >>> reps = [(y, x**2), (x, 2)]\n",
      " |      >>> (x + y).subs(reps)\n",
      " |      6\n",
      " |      >>> (x + y).subs(reversed(reps))\n",
      " |      x**2 + 2\n",
      " |      \n",
      " |      >>> (x**2 + x**4).subs(x**2, y)\n",
      " |      y**2 + y\n",
      " |      \n",
      " |      To replace only the x**2 but not the x**4, use xreplace:\n",
      " |      \n",
      " |      >>> (x**2 + x**4).xreplace({x**2: y})\n",
      " |      x**4 + y\n",
      " |      \n",
      " |      To delay evaluation until all substitutions have been made,\n",
      " |      set the keyword ``simultaneous`` to True:\n",
      " |      \n",
      " |      >>> (x/y).subs([(x, 0), (y, 0)])\n",
      " |      0\n",
      " |      >>> (x/y).subs([(x, 0), (y, 0)], simultaneous=True)\n",
      " |      nan\n",
      " |      \n",
      " |      This has the added feature of not allowing subsequent substitutions\n",
      " |      to affect those already made:\n",
      " |      \n",
      " |      >>> ((x + y)/y).subs({x + y: y, y: x + y})\n",
      " |      1\n",
      " |      >>> ((x + y)/y).subs({x + y: y, y: x + y}, simultaneous=True)\n",
      " |      y/(x + y)\n",
      " |      \n",
      " |      In order to obtain a canonical result, unordered iterables are\n",
      " |      sorted by count_op length, number of arguments and by the\n",
      " |      default_sort_key to break any ties. All other iterables are left\n",
      " |      unsorted.\n",
      " |      \n",
      " |      >>> from sympy import sqrt, sin, cos\n",
      " |      >>> from sympy.abc import a, b, c, d, e\n",
      " |      \n",
      " |      >>> A = (sqrt(sin(2*x)), a)\n",
      " |      >>> B = (sin(2*x), b)\n",
      " |      >>> C = (cos(2*x), c)\n",
      " |      >>> D = (x, d)\n",
      " |      >>> E = (exp(x), e)\n",
      " |      \n",
      " |      >>> expr = sqrt(sin(2*x))*sin(exp(x)*x)*cos(2*x) + sin(2*x)\n",
      " |      \n",
      " |      >>> expr.subs(dict([A, B, C, D, E]))\n",
      " |      a*c*sin(d*e) + b\n",
      " |      \n",
      " |      The resulting expression represents a literal replacement of the\n",
      " |      old arguments with the new arguments. This may not reflect the\n",
      " |      limiting behavior of the expression:\n",
      " |      \n",
      " |      >>> (x**3 - 3*x).subs({x: oo})\n",
      " |      nan\n",
      " |      \n",
      " |      >>> limit(x**3 - 3*x, x, oo)\n",
      " |      oo\n",
      " |      \n",
      " |      If the substitution will be followed by numerical\n",
      " |      evaluation, it is better to pass the substitution to\n",
      " |      evalf as\n",
      " |      \n",
      " |      >>> (1/x).evalf(subs={x: 3.0}, n=21)\n",
      " |      0.333333333333333333333\n",
      " |      \n",
      " |      rather than\n",
      " |      \n",
      " |      >>> (1/x).subs({x: 3.0}).evalf(21)\n",
      " |      0.333333333333333314830\n",
      " |      \n",
      " |      as the former will ensure that the desired level of precision is\n",
      " |      obtained.\n",
      " |      \n",
      " |      See Also\n",
      " |      ========\n",
      " |      replace: replacement capable of doing wildcard-like matching,\n",
      " |               parsing of match, and conditional replacements\n",
      " |      xreplace: exact node replacement in expr tree; also capable of\n",
      " |                using matching rules\n",
      " |      sympy.core.evalf.EvalfMixin.evalf: calculates the given formula to a desired level of precision\n",
      " |  \n",
      " |  xreplace(self, rule)\n",
      " |      Replace occurrences of objects within the expression.\n",
      " |      \n",
      " |      Parameters\n",
      " |      ==========\n",
      " |      \n",
      " |      rule : dict-like\n",
      " |          Expresses a replacement rule\n",
      " |      \n",
      " |      Returns\n",
      " |      =======\n",
      " |      \n",
      " |      xreplace : the result of the replacement\n",
      " |      \n",
      " |      Examples\n",
      " |      ========\n",
      " |      \n",
      " |      >>> from sympy import symbols, pi, exp\n",
      " |      >>> x, y, z = symbols('x y z')\n",
      " |      >>> (1 + x*y).xreplace({x: pi})\n",
      " |      pi*y + 1\n",
      " |      >>> (1 + x*y).xreplace({x: pi, y: 2})\n",
      " |      1 + 2*pi\n",
      " |      \n",
      " |      Replacements occur only if an entire node in the expression tree is\n",
      " |      matched:\n",
      " |      \n",
      " |      >>> (x*y + z).xreplace({x*y: pi})\n",
      " |      z + pi\n",
      " |      >>> (x*y*z).xreplace({x*y: pi})\n",
      " |      x*y*z\n",
      " |      >>> (2*x).xreplace({2*x: y, x: z})\n",
      " |      y\n",
      " |      >>> (2*2*x).xreplace({2*x: y, x: z})\n",
      " |      4*z\n",
      " |      >>> (x + y + 2).xreplace({x + y: 2})\n",
      " |      x + y + 2\n",
      " |      >>> (x + 2 + exp(x + 2)).xreplace({x + 2: y})\n",
      " |      x + exp(y) + 2\n",
      " |      \n",
      " |      xreplace does not differentiate between free and bound symbols. In the\n",
      " |      following, subs(x, y) would not change x since it is a bound symbol,\n",
      " |      but xreplace does:\n",
      " |      \n",
      " |      >>> from sympy import Integral\n",
      " |      >>> Integral(x, (x, 1, 2*x)).xreplace({x: y})\n",
      " |      Integral(y, (y, 1, 2*y))\n",
      " |      \n",
      " |      Trying to replace x with an expression raises an error:\n",
      " |      \n",
      " |      >>> Integral(x, (x, 1, 2*x)).xreplace({x: 2*y}) # doctest: +SKIP\n",
      " |      ValueError: Invalid limits given: ((2*y, 1, 4*y),)\n",
      " |      \n",
      " |      See Also\n",
      " |      ========\n",
      " |      replace: replacement capable of doing wildcard-like matching,\n",
      " |               parsing of match, and conditional replacements\n",
      " |      subs: substitution of subexpressions as defined by the objects\n",
      " |            themselves.\n",
      " |  \n",
      " |  ----------------------------------------------------------------------\n",
      " |  Class methods inherited from sympy.core.basic.Basic:\n",
      " |  \n",
      " |  class_key() from sympy.core.assumptions.ManagedProperties\n",
      " |      Nice order of classes.\n",
      " |  \n",
      " |  fromiter(args, **assumptions) from sympy.core.assumptions.ManagedProperties\n",
      " |      Create a new object from an iterable.\n",
      " |      \n",
      " |      This is a convenience function that allows one to create objects from\n",
      " |      any iterable, without having to convert to a list or tuple first.\n",
      " |      \n",
      " |      Examples\n",
      " |      ========\n",
      " |      \n",
      " |      >>> from sympy import Tuple\n",
      " |      >>> Tuple.fromiter(i for i in range(5))\n",
      " |      (0, 1, 2, 3, 4)\n",
      " |  \n",
      " |  ----------------------------------------------------------------------\n",
      " |  Readonly properties inherited from sympy.core.basic.Basic:\n",
      " |  \n",
      " |  args\n",
      " |      Returns a tuple of arguments of 'self'.\n",
      " |      \n",
      " |      Examples\n",
      " |      ========\n",
      " |      \n",
      " |      >>> from sympy import cot\n",
      " |      >>> from sympy.abc import x, y\n",
      " |      \n",
      " |      >>> cot(x).args\n",
      " |      (x,)\n",
      " |      \n",
      " |      >>> cot(x).args[0]\n",
      " |      x\n",
      " |      \n",
      " |      >>> (x*y).args\n",
      " |      (x, y)\n",
      " |      \n",
      " |      >>> (x*y).args[1]\n",
      " |      y\n",
      " |      \n",
      " |      Notes\n",
      " |      =====\n",
      " |      \n",
      " |      Never use self._args, always use self.args.\n",
      " |      Only use _args in __new__ when creating a new function.\n",
      " |      Do not override .args() from Basic (so that it is easy to\n",
      " |      change the interface in the future if needed).\n",
      " |  \n",
      " |  assumptions0\n",
      " |      Return object `type` assumptions.\n",
      " |      \n",
      " |      For example:\n",
      " |      \n",
      " |        Symbol('x', real=True)\n",
      " |        Symbol('x', integer=True)\n",
      " |      \n",
      " |      are different objects. In other words, besides Python type (Symbol in\n",
      " |      this case), the initial assumptions are also forming their typeinfo.\n",
      " |      \n",
      " |      Examples\n",
      " |      ========\n",
      " |      \n",
      " |      >>> from sympy import Symbol\n",
      " |      >>> from sympy.abc import x\n",
      " |      >>> x.assumptions0\n",
      " |      {'commutative': True}\n",
      " |      >>> x = Symbol(\"x\", positive=True)\n",
      " |      >>> x.assumptions0\n",
      " |      {'commutative': True, 'complex': True, 'extended_negative': False,\n",
      " |       'extended_nonnegative': True, 'extended_nonpositive': False,\n",
      " |       'extended_nonzero': True, 'extended_positive': True, 'extended_real':\n",
      " |       True, 'finite': True, 'hermitian': True, 'imaginary': False,\n",
      " |       'infinite': False, 'negative': False, 'nonnegative': True,\n",
      " |       'nonpositive': False, 'nonzero': True, 'positive': True, 'real':\n",
      " |       True, 'zero': False}\n",
      " |  \n",
      " |  canonical_variables\n",
      " |      Return a dictionary mapping any variable defined in\n",
      " |      ``self.bound_symbols`` to Symbols that do not clash\n",
      " |      with any free symbols in the expression.\n",
      " |      \n",
      " |      Examples\n",
      " |      ========\n",
      " |      \n",
      " |      >>> from sympy import Lambda\n",
      " |      >>> from sympy.abc import x\n",
      " |      >>> Lambda(x, 2*x).canonical_variables\n",
      " |      {x: _0}\n",
      " |  \n",
      " |  expr_free_symbols\n",
      " |  \n",
      " |  free_symbols\n",
      " |      Return from the atoms of self those which are free symbols.\n",
      " |      \n",
      " |      Not all free symbols are ``Symbol``. Eg: IndexedBase('I')[0].free_symbols\n",
      " |      \n",
      " |      For most expressions, all symbols are free symbols. For some classes\n",
      " |      this is not true. e.g. Integrals use Symbols for the dummy variables\n",
      " |      which are bound variables, so Integral has a method to return all\n",
      " |      symbols except those. Derivative keeps track of symbols with respect\n",
      " |      to which it will perform a derivative; those are\n",
      " |      bound variables, too, so it has its own free_symbols method.\n",
      " |      \n",
      " |      Any other method that uses bound variables should implement a\n",
      " |      free_symbols method.\n",
      " |  \n",
      " |  func\n",
      " |      The top-level function in an expression.\n",
      " |      \n",
      " |      The following should hold for all objects::\n",
      " |      \n",
      " |          >> x == x.func(*x.args)\n",
      " |      \n",
      " |      Examples\n",
      " |      ========\n",
      " |      \n",
      " |      >>> from sympy.abc import x\n",
      " |      >>> a = 2*x\n",
      " |      >>> a.func\n",
      " |      <class 'sympy.core.mul.Mul'>\n",
      " |      >>> a.args\n",
      " |      (2, x)\n",
      " |      >>> a.func(*a.args)\n",
      " |      2*x\n",
      " |      >>> a == a.func(*a.args)\n",
      " |      True\n",
      " |  \n",
      " |  is_algebraic\n",
      " |  \n",
      " |  is_antihermitian\n",
      " |  \n",
      " |  is_commutative\n",
      " |  \n",
      " |  is_comparable\n",
      " |      Return True if self can be computed to a real number\n",
      " |      (or already is a real number) with precision, else False.\n",
      " |      \n",
      " |      Examples\n",
      " |      ========\n",
      " |      \n",
      " |      >>> from sympy import exp_polar, pi, I\n",
      " |      >>> (I*exp_polar(I*pi/2)).is_comparable\n",
      " |      True\n",
      " |      >>> (I*exp_polar(I*pi*2)).is_comparable\n",
      " |      False\n",
      " |      \n",
      " |      A False result does not mean that `self` cannot be rewritten\n",
      " |      into a form that would be comparable. For example, the\n",
      " |      difference computed below is zero but without simplification\n",
      " |      it does not evaluate to a zero with precision:\n",
      " |      \n",
      " |      >>> e = 2**pi*(1 + 2**pi)\n",
      " |      >>> dif = e - e.expand()\n",
      " |      >>> dif.is_comparable\n",
      " |      False\n",
      " |      >>> dif.n(2)._prec\n",
      " |      1\n",
      " |  \n",
      " |  is_complex\n",
      " |  \n",
      " |  is_composite\n",
      " |  \n",
      " |  is_even\n",
      " |  \n",
      " |  is_extended_negative\n",
      " |  \n",
      " |  is_extended_nonnegative\n",
      " |  \n",
      " |  is_extended_nonpositive\n",
      " |  \n",
      " |  is_extended_nonzero\n",
      " |  \n",
      " |  is_extended_positive\n",
      " |  \n",
      " |  is_extended_real\n",
      " |  \n",
      " |  is_finite\n",
      " |  \n",
      " |  is_hermitian\n",
      " |  \n",
      " |  is_imaginary\n",
      " |  \n",
      " |  is_infinite\n",
      " |  \n",
      " |  is_integer\n",
      " |  \n",
      " |  is_irrational\n",
      " |  \n",
      " |  is_negative\n",
      " |  \n",
      " |  is_noninteger\n",
      " |  \n",
      " |  is_nonnegative\n",
      " |  \n",
      " |  is_nonpositive\n",
      " |  \n",
      " |  is_nonzero\n",
      " |  \n",
      " |  is_odd\n",
      " |  \n",
      " |  is_polar\n",
      " |  \n",
      " |  is_positive\n",
      " |  \n",
      " |  is_prime\n",
      " |  \n",
      " |  is_rational\n",
      " |  \n",
      " |  is_real\n",
      " |  \n",
      " |  is_transcendental\n",
      " |  \n",
      " |  is_zero\n",
      " |  \n",
      " |  ----------------------------------------------------------------------\n",
      " |  Data and other attributes inherited from sympy.core.basic.Basic:\n",
      " |  \n",
      " |  __annotations__ = {'_args': 'tuple[Basic, ...]', '_mhash': 'int | None...\n",
      " |  \n",
      " |  is_Add = False\n",
      " |  \n",
      " |  is_AlgebraicNumber = False\n",
      " |  \n",
      " |  is_Atom = False\n",
      " |  \n",
      " |  is_Boolean = False\n",
      " |  \n",
      " |  is_Derivative = False\n",
      " |  \n",
      " |  is_Dummy = False\n",
      " |  \n",
      " |  is_Equality = False\n",
      " |  \n",
      " |  is_Float = False\n",
      " |  \n",
      " |  is_Function = False\n",
      " |  \n",
      " |  is_Indexed = False\n",
      " |  \n",
      " |  is_Integer = False\n",
      " |  \n",
      " |  is_MatAdd = False\n",
      " |  \n",
      " |  is_MatMul = False\n",
      " |  \n",
      " |  is_Matrix = False\n",
      " |  \n",
      " |  is_Mul = False\n",
      " |  \n",
      " |  is_Not = False\n",
      " |  \n",
      " |  is_Number = False\n",
      " |  \n",
      " |  is_NumberSymbol = False\n",
      " |  \n",
      " |  is_Order = False\n",
      " |  \n",
      " |  is_Piecewise = False\n",
      " |  \n",
      " |  is_Point = False\n",
      " |  \n",
      " |  is_Poly = False\n",
      " |  \n",
      " |  is_Pow = False\n",
      " |  \n",
      " |  is_Rational = False\n",
      " |  \n",
      " |  is_Relational = False\n",
      " |  \n",
      " |  is_Symbol = False\n",
      " |  \n",
      " |  is_Vector = False\n",
      " |  \n",
      " |  is_Wild = False\n",
      " |  \n",
      " |  is_symbol = False\n",
      " |  \n",
      " |  ----------------------------------------------------------------------\n",
      " |  Methods inherited from sympy.core.evalf.EvalfMixin:\n",
      " |  \n",
      " |  evalf(self, n=15, subs=None, maxn=100, chop=False, strict=False, quad=None, verbose=False)\n",
      " |      Evaluate the given formula to an accuracy of *n* digits.\n",
      " |      \n",
      " |      Parameters\n",
      " |      ==========\n",
      " |      \n",
      " |      subs : dict, optional\n",
      " |          Substitute numerical values for symbols, e.g.\n",
      " |          ``subs={x:3, y:1+pi}``. The substitutions must be given as a\n",
      " |          dictionary.\n",
      " |      \n",
      " |      maxn : int, optional\n",
      " |          Allow a maximum temporary working precision of maxn digits.\n",
      " |      \n",
      " |      chop : bool or number, optional\n",
      " |          Specifies how to replace tiny real or imaginary parts in\n",
      " |          subresults by exact zeros.\n",
      " |      \n",
      " |          When ``True`` the chop value defaults to standard precision.\n",
      " |      \n",
      " |          Otherwise the chop value is used to determine the\n",
      " |          magnitude of \"small\" for purposes of chopping.\n",
      " |      \n",
      " |          >>> from sympy import N\n",
      " |          >>> x = 1e-4\n",
      " |          >>> N(x, chop=True)\n",
      " |          0.000100000000000000\n",
      " |          >>> N(x, chop=1e-5)\n",
      " |          0.000100000000000000\n",
      " |          >>> N(x, chop=1e-4)\n",
      " |          0\n",
      " |      \n",
      " |      strict : bool, optional\n",
      " |          Raise ``PrecisionExhausted`` if any subresult fails to\n",
      " |          evaluate to full accuracy, given the available maxprec.\n",
      " |      \n",
      " |      quad : str, optional\n",
      " |          Choose algorithm for numerical quadrature. By default,\n",
      " |          tanh-sinh quadrature is used. For oscillatory\n",
      " |          integrals on an infinite interval, try ``quad='osc'``.\n",
      " |      \n",
      " |      verbose : bool, optional\n",
      " |          Print debug information.\n",
      " |      \n",
      " |      Notes\n",
      " |      =====\n",
      " |      \n",
      " |      When Floats are naively substituted into an expression,\n",
      " |      precision errors may adversely affect the result. For example,\n",
      " |      adding 1e16 (a Float) to 1 will truncate to 1e16; if 1e16 is\n",
      " |      then subtracted, the result will be 0.\n",
      " |      That is exactly what happens in the following:\n",
      " |      \n",
      " |      >>> from sympy.abc import x, y, z\n",
      " |      >>> values = {x: 1e16, y: 1, z: 1e16}\n",
      " |      >>> (x + y - z).subs(values)\n",
      " |      0\n",
      " |      \n",
      " |      Using the subs argument for evalf is the accurate way to\n",
      " |      evaluate such an expression:\n",
      " |      \n",
      " |      >>> (x + y - z).evalf(subs=values)\n",
      " |      1.00000000000000\n",
      " |  \n",
      " |  n = evalf(self, n=15, subs=None, maxn=100, chop=False, strict=False, quad=None, verbose=False)\n",
      "\n"
     ]
    }
   ],
   "source": [
    "help(Circle)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "id": "d58a44cf",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/svg+xml": [
       "<svg xmlns=\"http://www.w3.org/2000/svg\"\n",
       "            xmlns:xlink=\"http://www.w3.org/1999/xlink\"\n",
       "            width=\"100.0\" height=\"100.0\" viewBox=\"-3.20000000000000 1.80000000000000 2.40000000000000 2.40000000000000\"\n",
       "            preserveAspectRatio=\"xMinYMin meet\">\n",
       "            <defs>\n",
       "                <marker id=\"markerCircle\" markerWidth=\"8\" markerHeight=\"8\"\n",
       "                    refx=\"5\" refy=\"5\" markerUnits=\"strokeWidth\">\n",
       "                    <circle cx=\"5\" cy=\"5\" r=\"1.5\" style=\"stroke: none; fill:#000000;\"/>\n",
       "                </marker>\n",
       "                <marker id=\"markerArrow\" markerWidth=\"13\" markerHeight=\"13\" refx=\"2\" refy=\"4\"\n",
       "                       orient=\"auto\" markerUnits=\"strokeWidth\">\n",
       "                    <path d=\"M2,2 L2,6 L6,4\" style=\"fill: #000000;\" />\n",
       "                </marker>\n",
       "                <marker id=\"markerReverseArrow\" markerWidth=\"13\" markerHeight=\"13\" refx=\"6\" refy=\"4\"\n",
       "                       orient=\"auto\" markerUnits=\"strokeWidth\">\n",
       "                    <path d=\"M6,2 L6,6 L2,4\" style=\"fill: #000000;\" />\n",
       "                </marker>\n",
       "            </defs><g transform=\"matrix(1,0,0,-1,0,6.00000000000000)\"><ellipse fill=\"#66cc99\" stroke=\"#555555\" stroke-width=\"0.0480000000000000\" opacity=\"0.6\" cx=\"-2.00000000000000\" cy=\"3.00000000000000\" rx=\"1.00000000000000\" ry=\"1.00000000000000\"/></g></svg>"
      ],
      "text/latex": [
       "$\\displaystyle \\operatorname{Circle}\\left(\\operatorname{Point2D}\\left(-2, 3\\right), 1\\right)$"
      ],
      "text/plain": [
       "Circle(Point2D(-2, 3), 1)"
      ]
     },
     "execution_count": 25,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "c1=Circle(x**2+y**2+4*x-6*y+12)\n",
    "c1"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "id": "e6fe073c",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\operatorname{Point2D}\\left(-2, 3\\right)$"
      ],
      "text/plain": [
       "Point2D(-2, 3)"
      ]
     },
     "execution_count": 26,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "c1.center"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "id": "847a2f3c",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle 1$"
      ],
      "text/plain": [
       "1"
      ]
     },
     "execution_count": 27,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "c1.radius"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "id": "f9048f03",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\operatorname{Circle}\\left(\\operatorname{Point2D}\\left(1, 7\\right), \\sqrt{50 - k}\\right)$"
      ],
      "text/plain": [
       "Circle(Point2D(1, 7), sqrt(50 - k))"
      ]
     },
     "execution_count": 28,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "c2=Circle(x**2+y**2-2*x-14*y+k)\n",
    "c2"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "id": "89fbbc90",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle 5$"
      ],
      "text/plain": [
       "5"
      ]
     },
     "execution_count": 29,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "c1.center.distance(c2.center)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "id": "cf3734fe",
   "metadata": {},
   "outputs": [],
   "source": [
    "l=Line(Point(-2,-3),Point(2,1))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "id": "5c058ec8",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle - 4 \\left(x - y - 1\\right)$"
      ],
      "text/plain": [
       "-4*(x - y - 1)"
      ]
     },
     "execution_count": 32,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "factor(l.equation())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "id": "bc2fc604",
   "metadata": {},
   "outputs": [],
   "source": [
    "l1=Line(y-3)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 35,
   "id": "b99d25ec",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\operatorname{Point2D}\\left(4, 3\\right)$"
      ],
      "text/plain": [
       "Point2D(4, 3)"
      ]
     },
     "execution_count": 35,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "P=list(Intersection(l1,l))[0]\n",
    "P"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 36,
   "id": "a4717a5e",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/svg+xml": [
       "<svg xmlns=\"http://www.w3.org/2000/svg\"\n",
       "            xmlns:xlink=\"http://www.w3.org/1999/xlink\"\n",
       "            width=\"100.0\" height=\"100.0\" viewBox=\"-0.800000000000000 -1.80000000000000 9.60000000000000 9.60000000000000\"\n",
       "            preserveAspectRatio=\"xMinYMin meet\">\n",
       "            <defs>\n",
       "                <marker id=\"markerCircle\" markerWidth=\"8\" markerHeight=\"8\"\n",
       "                    refx=\"5\" refy=\"5\" markerUnits=\"strokeWidth\">\n",
       "                    <circle cx=\"5\" cy=\"5\" r=\"1.5\" style=\"stroke: none; fill:#000000;\"/>\n",
       "                </marker>\n",
       "                <marker id=\"markerArrow\" markerWidth=\"13\" markerHeight=\"13\" refx=\"2\" refy=\"4\"\n",
       "                       orient=\"auto\" markerUnits=\"strokeWidth\">\n",
       "                    <path d=\"M2,2 L2,6 L6,4\" style=\"fill: #000000;\" />\n",
       "                </marker>\n",
       "                <marker id=\"markerReverseArrow\" markerWidth=\"13\" markerHeight=\"13\" refx=\"6\" refy=\"4\"\n",
       "                       orient=\"auto\" markerUnits=\"strokeWidth\">\n",
       "                    <path d=\"M6,2 L6,6 L2,4\" style=\"fill: #000000;\" />\n",
       "                </marker>\n",
       "            </defs><g transform=\"matrix(1,0,0,-1,0,6.00000000000000)\"><ellipse fill=\"#66cc99\" stroke=\"#555555\" stroke-width=\"0.192000000000000\" opacity=\"0.6\" cx=\"4.00000000000000\" cy=\"3.00000000000000\" rx=\"4.00000000000000\" ry=\"4.00000000000000\"/></g></svg>"
      ],
      "text/latex": [
       "$\\displaystyle \\operatorname{Circle}\\left(\\operatorname{Point2D}\\left(4, 3\\right), 4\\right)$"
      ],
      "text/plain": [
       "Circle(Point2D(4, 3), 4)"
      ]
     },
     "execution_count": 36,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "c=Circle(P,P.distance(Point(0,3)))\n",
    "c"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 37,
   "id": "68bf1115",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/svg+xml": [
       "<svg xmlns=\"http://www.w3.org/2000/svg\"\n",
       "            xmlns:xlink=\"http://www.w3.org/1999/xlink\"\n",
       "            width=\"100.0\" height=\"100.0\" viewBox=\"0 -1.50000000000000 6.00000000000000 6.00000000000000\"\n",
       "            preserveAspectRatio=\"xMinYMin meet\">\n",
       "            <defs>\n",
       "                <marker id=\"markerCircle\" markerWidth=\"8\" markerHeight=\"8\"\n",
       "                    refx=\"5\" refy=\"5\" markerUnits=\"strokeWidth\">\n",
       "                    <circle cx=\"5\" cy=\"5\" r=\"1.5\" style=\"stroke: none; fill:#000000;\"/>\n",
       "                </marker>\n",
       "                <marker id=\"markerArrow\" markerWidth=\"13\" markerHeight=\"13\" refx=\"2\" refy=\"4\"\n",
       "                       orient=\"auto\" markerUnits=\"strokeWidth\">\n",
       "                    <path d=\"M2,2 L2,6 L6,4\" style=\"fill: #000000;\" />\n",
       "                </marker>\n",
       "                <marker id=\"markerReverseArrow\" markerWidth=\"13\" markerHeight=\"13\" refx=\"6\" refy=\"4\"\n",
       "                       orient=\"auto\" markerUnits=\"strokeWidth\">\n",
       "                    <path d=\"M6,2 L6,6 L2,4\" style=\"fill: #000000;\" />\n",
       "                </marker>\n",
       "            </defs><g transform=\"matrix(1,0,0,-1,0,3.00000000000000)\"><ellipse fill=\"#66cc99\" stroke=\"#555555\" stroke-width=\"0.120000000000000\" opacity=\"0.6\" cx=\"3.00000000000000\" cy=\"1.50000000000000\" rx=\"2.50000000000000\" ry=\"2.50000000000000\"/></g></svg>"
      ],
      "text/latex": [
       "$\\displaystyle \\operatorname{Circle}\\left(\\operatorname{Point2D}\\left(3, \\frac{3}{2}\\right), \\frac{5}{2}\\right)$"
      ],
      "text/plain": [
       "Circle(Point2D(3, 3/2), 5/2)"
      ]
     },
     "execution_count": 37,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "c2=Circle(x**2+y**2-6*x-3*y+5)\n",
    "c2"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 40,
   "id": "a2475074",
   "metadata": {},
   "outputs": [],
   "source": [
    "M,N=Intersection(c2,c)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 41,
   "id": "b7f42b52",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle 2 \\sqrt{3}$"
      ],
      "text/plain": [
       "2*sqrt(3)"
      ]
     },
     "execution_count": 41,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "M.distance(N)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 43,
   "id": "6a8291f5",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\frac{2 \\sqrt{39} \\cdot \\left(2 x + 3 y - 4\\right)}{13}$"
      ],
      "text/plain": [
       "2*sqrt(39)*(2*x + 3*y - 4)/13"
      ]
     },
     "execution_count": 43,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "factor(Line(M,N).equation())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 44,
   "id": "e9c18a74",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\left\\{-5, 2\\right\\}$"
      ],
      "text/plain": [
       "{-5, 2}"
      ]
     },
     "execution_count": 44,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "solveset((x+1)**2+(x+2)**2-25,x,Reals)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 48,
   "id": "ca650eaf",
   "metadata": {
    "collapsed": true
   },
   "outputs": [
    {
     "data": {
      "image/png": "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G9/I3//933fp91++fHk233zz/Pu//3s+/elPr3r/aaedlsceeyy33377u76mvb097e3tq95etmxZtt9++yxcuFDYraeXX05OOql67bsTTyx6DdSnxsbGNDQ0rPVzOhR2b/5tFwCAYnTkUQdH7Nagra0tQ4YM8Tf8kvNzXjevvvpqLrrookyfPj377bdfvv3tb2fEiBE1/Z6LFy/Otttum1mzZmX33Xdf9f7zzz8/1113XX7961+/62veecRu8eLF2X333fO73/0uW221VU331oPf/KZ67bvFi5Mzz6w+4aI78Oe5PtTzz7kjR+z6dOSOGhoa6u5/vDcNHDiwbn/v9cTPuWP69OmTT3/601m+fHn+5V/+JbNnz86kSZMybdq0NDY21uR79u/fP717986yZctW+xm1tbVlyy23XKefW2Njo59zJ/j4x6u3u+5K/umfqufe7bZb0ave4s9zffBzfm+eFQus1WWXXZYJEyZk5513TlNTUw444IDcd999mTRpUi655JLMmzcv22+/fR566KGafP++fftm1KhRmTVr1mrvnzVrVvbaa6+afE86Zr/9khtvTO64Ixk7NqnRvwLAOujQETugfp1zzjnZY4898oUvfCF77LFHRo8enX79+q36+Be/+MWce+65OfbYY/PbGr2a/OTJkzN+/PiMHj06e+65Z6644oosWLAgEydOrMn3o+OampKvf736sOzJJ1dj74tfTN72rwjQhYTdGvTr1y9Tp05d7f/AKB8/5/fXkevYTZgwIWeddVbNNhx11FF56aWX8q1vfSuLFy/OjjvumNtuuy0f/ehHO/T1b/58/ZxrZ4stkmuvTc4/P5kyJRkxIpk0qWs3+PNcH/yc18517IAPrFKpZO7cufnEJz5R9JT35Dp2XeuVV5KLL04efTS57LKkRqdfAu9B2AGlJ+y6XqWS3Htv9Ry8V19NLroo2XjjoldB+Qk7oPSEXbF+/vPkRz9Khg6tvlTZJpsUvQjKy7NiAaipgw9O/vVfk+22Sz7/+eSGG5K3XWYQ6ETCDoAucdRR1cCrVJJx45L585OVK4teBeXioVig9DwU2/089VT1WbS//GVywQXJ8OHJhhsWvQp6Pkfs1kF7e3tGjhyZhoaGzJs3r+g5dKJnnnkmEyZMyPDhw7PhhhtmxIgRmTp1apYvX170ND6gSy65JDvttFOSZJ999sk999xT8CKSZOutk7POql4e5dZbk+OPr76SxYoV635fLS0t2W233dLY2JhBgwZl3LhxefLJJzt/NN1GS0tLGhoacuqppxY9pdsRduvgtNNOy5Zbbln0DGrgiSeeyMqVK3P55Zfn8ccfz/e+971cdtll+drXvlb0ND6A66+/Pqeeemq++tWvJkn23HPPjB07NgsWLCh4GW/aYYfkn/85mTYt+e1vk/Hjk5kz1+0+5syZk0mTJuX+++/PrFmz8sYbb+TAAw/MK6+8UovJFOzBBx/MFVdckZ133rnoKd2Sh2I76Pbbb8/kyZNz0003ZYcddsgjjzySkSNHFj2LGjr//PNz6aWX5umnny56Cuupubk5u+66a84777xVD8U2Nzdn3LhxaWlpKXoe7+HPf04uvTSZN++ta+D1WcdL6S9ZsiSDBg3KnDlzss8++9RiJgX5y1/+kl133TWXXHJJzj777IwcOTLf//73i57VrThi1wEvvvhijj/++FxzzTXZaKONip5DF2ltbc2mm25a9AzW0/Lly/PrX/86Bx544GrvP/DAA/OLX/yioFW8n002qb5yxSmnJN/+dnLaackPf7hu99Ha2pok/vyW0KRJk/KpT30qBxxwQNFTui0vKfY+KpVKjj322EycODGjR4/OM888U/QkusD8+fMzffr0XHjhhUVPYT0tXbo0K1asyOabb77a+zfffPO88MILBa2io/baq3pra0taWqrXv/vEJ5JDD13711UqlUyePDl77713dtxxxy7ZSte47rrr8vDDD+fBBx8sekq3VrdH7KZNm5aGhoa13h566KFMnz49bW1tmTJlStGTWQ8d/Tm/3aJFi3LwwQfniCOOyJe+9KWCltNZGhoaVnu7Uqm86310XwMHVsPum99MnnyyepmUuXPX/PknnnhiHn300Vx77bVdtpHaW7hwYU455ZTMmDEj/fv3L3pOt1a359gtXbo0S5cuXevnDBs2LEcffXRuueWW1f6PYMWKFendu3eOOeaYXH311bWeygfQ0Z/zm/+hWLRoUcaMGZPm5uZcddVV6dWrbv/u0+MtX748G220UW644Ybsv//+q86xO+usszJv3rzMmTOn6Imsh/b26uvQ/sd/JM3NycknJ01N1Y+ddNJJmTlzZubOnZvhw4cXO5RONXPmzBx66KHp3bv3qvetWLEiDQ0N6dWrV9rb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\n",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/plain": [
       "<sympy.plotting.plot.Plot at 0x7f44d6a9a0a0>"
      ]
     },
     "execution_count": 48,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "plot_implicit(c.equation())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 50,
   "id": "13dd5eb9",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/svg+xml": [
       "<svg xmlns=\"http://www.w3.org/2000/svg\"\n",
       "            xmlns:xlink=\"http://www.w3.org/1999/xlink\"\n",
       "            width=\"100.0\" height=\"100.0\" viewBox=\"-10.2000000000000 -21.2000000000000 26.4000000000000 26.4000000000000\"\n",
       "            preserveAspectRatio=\"xMinYMin meet\">\n",
       "            <defs>\n",
       "                <marker id=\"markerCircle\" markerWidth=\"8\" markerHeight=\"8\"\n",
       "                    refx=\"5\" refy=\"5\" markerUnits=\"strokeWidth\">\n",
       "                    <circle cx=\"5\" cy=\"5\" r=\"1.5\" style=\"stroke: none; fill:#000000;\"/>\n",
       "                </marker>\n",
       "                <marker id=\"markerArrow\" markerWidth=\"13\" markerHeight=\"13\" refx=\"2\" refy=\"4\"\n",
       "                       orient=\"auto\" markerUnits=\"strokeWidth\">\n",
       "                    <path d=\"M2,2 L2,6 L6,4\" style=\"fill: #000000;\" />\n",
       "                </marker>\n",
       "                <marker id=\"markerReverseArrow\" markerWidth=\"13\" markerHeight=\"13\" refx=\"6\" refy=\"4\"\n",
       "                       orient=\"auto\" markerUnits=\"strokeWidth\">\n",
       "                    <path d=\"M6,2 L6,6 L2,4\" style=\"fill: #000000;\" />\n",
       "                </marker>\n",
       "            </defs><g transform=\"matrix(1,0,0,-1,0,-16.0000000000000)\"><ellipse fill=\"#66cc99\" stroke=\"#555555\" stroke-width=\"0.528000000000000\" opacity=\"0.6\" cx=\"3.00000000000000\" cy=\"-8.00000000000000\" rx=\"11.0000000000000\" ry=\"11.0000000000000\"/></g></svg>"
      ],
      "text/latex": [
       "$\\displaystyle \\operatorname{Circle}\\left(\\operatorname{Point2D}\\left(3, -8\\right), 11\\right)$"
      ],
      "text/plain": [
       "Circle(Point2D(3, -8), 11)"
      ]
     },
     "execution_count": 50,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "c1=Circle(x**2+y**2-6*x+16*y-48)\n",
    "c1"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 51,
   "id": "d950a8f8",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/svg+xml": [
       "<svg xmlns=\"http://www.w3.org/2000/svg\"\n",
       "            xmlns:xlink=\"http://www.w3.org/1999/xlink\"\n",
       "            width=\"100.0\" height=\"100.0\" viewBox=\"-11.6000000000000 -5.60000000000000 19.2000000000000 19.2000000000000\"\n",
       "            preserveAspectRatio=\"xMinYMin meet\">\n",
       "            <defs>\n",
       "                <marker id=\"markerCircle\" markerWidth=\"8\" markerHeight=\"8\"\n",
       "                    refx=\"5\" refy=\"5\" markerUnits=\"strokeWidth\">\n",
       "                    <circle cx=\"5\" cy=\"5\" r=\"1.5\" style=\"stroke: none; fill:#000000;\"/>\n",
       "                </marker>\n",
       "                <marker id=\"markerArrow\" markerWidth=\"13\" markerHeight=\"13\" refx=\"2\" refy=\"4\"\n",
       "                       orient=\"auto\" markerUnits=\"strokeWidth\">\n",
       "                    <path d=\"M2,2 L2,6 L6,4\" style=\"fill: #000000;\" />\n",
       "                </marker>\n",
       "                <marker id=\"markerReverseArrow\" markerWidth=\"13\" markerHeight=\"13\" refx=\"6\" refy=\"4\"\n",
       "                       orient=\"auto\" markerUnits=\"strokeWidth\">\n",
       "                    <path d=\"M6,2 L6,6 L2,4\" style=\"fill: #000000;\" />\n",
       "                </marker>\n",
       "            </defs><g transform=\"matrix(1,0,0,-1,0,8.00000000000000)\"><ellipse fill=\"#66cc99\" stroke=\"#555555\" stroke-width=\"0.384000000000000\" opacity=\"0.6\" cx=\"-2.00000000000000\" cy=\"4.00000000000000\" rx=\"8.00000000000000\" ry=\"8.00000000000000\"/></g></svg>"
      ],
      "text/latex": [
       "$\\displaystyle \\operatorname{Circle}\\left(\\operatorname{Point2D}\\left(-2, 4\\right), 8\\right)$"
      ],
      "text/plain": [
       "Circle(Point2D(-2, 4), 8)"
      ]
     },
     "execution_count": 51,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "c2=Circle(x**2+y**2+4*x-8*y-44)\n",
    "c2"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 53,
   "id": "3a60f2a9",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/svg+xml": [
       "<svg xmlns=\"http://www.w3.org/2000/svg\"\n",
       "            xmlns:xlink=\"http://www.w3.org/1999/xlink\"\n",
       "            width=\"100.0\" height=\"100.0\" viewBox=\"-8.00646812725470 -10.5064681272547 17.0129362545094 17.0129362545094\"\n",
       "            preserveAspectRatio=\"xMinYMin meet\">\n",
       "            <defs>\n",
       "                <marker id=\"markerCircle\" markerWidth=\"8\" markerHeight=\"8\"\n",
       "                    refx=\"5\" refy=\"5\" markerUnits=\"strokeWidth\">\n",
       "                    <circle cx=\"5\" cy=\"5\" r=\"1.5\" style=\"stroke: none; fill:#000000;\"/>\n",
       "                </marker>\n",
       "                <marker id=\"markerArrow\" markerWidth=\"13\" markerHeight=\"13\" refx=\"2\" refy=\"4\"\n",
       "                       orient=\"auto\" markerUnits=\"strokeWidth\">\n",
       "                    <path d=\"M2,2 L2,6 L6,4\" style=\"fill: #000000;\" />\n",
       "                </marker>\n",
       "                <marker id=\"markerReverseArrow\" markerWidth=\"13\" markerHeight=\"13\" refx=\"6\" refy=\"4\"\n",
       "                       orient=\"auto\" markerUnits=\"strokeWidth\">\n",
       "                    <path d=\"M6,2 L6,6 L2,4\" style=\"fill: #000000;\" />\n",
       "                </marker>\n",
       "            </defs><g transform=\"matrix(1,0,0,-1,0,-4.00000000000000)\"><ellipse fill=\"#66cc99\" stroke=\"#555555\" stroke-width=\"0.340258725090188\" opacity=\"0.6\" cx=\"0.500000000000000\" cy=\"-2.00000000000000\" rx=\"7.08872343937891\" ry=\"7.08872343937891\"/></g></svg>"
      ],
      "text/latex": [
       "$\\displaystyle \\operatorname{Circle}\\left(\\operatorname{Point2D}\\left(\\frac{1}{2}, -2\\right), \\frac{\\sqrt{201}}{2}\\right)$"
      ],
      "text/plain": [
       "Circle(Point2D(1/2, -2), sqrt(201)/2)"
      ]
     },
     "execution_count": 53,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "c3=Circle(c1.equation()+c2.equation())\n",
    "c3"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 55,
   "id": "86e076b4",
   "metadata": {},
   "outputs": [],
   "source": [
    "l3=Line(simplify(c1.equation()-c2.equation()))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 57,
   "id": "7a556026",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle - \\frac{5 x - 12 y + 2}{12}$"
      ],
      "text/plain": [
       "-(5*x - 12*y + 2)/12"
      ]
     },
     "execution_count": 57,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "factor(l3.equation())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 58,
   "id": "9319f2c8",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/svg+xml": [
       "<svg xmlns=\"http://www.w3.org/2000/svg\"\n",
       "            xmlns:xlink=\"http://www.w3.org/1999/xlink\"\n",
       "            width=\"100.0\" height=\"100.0\" viewBox=\"-1.40000000000000 -2.40000000000000 4.80000000000000 4.80000000000000\"\n",
       "            preserveAspectRatio=\"xMinYMin meet\">\n",
       "            <defs>\n",
       "                <marker id=\"markerCircle\" markerWidth=\"8\" markerHeight=\"8\"\n",
       "                    refx=\"5\" refy=\"5\" markerUnits=\"strokeWidth\">\n",
       "                    <circle cx=\"5\" cy=\"5\" r=\"1.5\" style=\"stroke: none; fill:#000000;\"/>\n",
       "                </marker>\n",
       "                <marker id=\"markerArrow\" markerWidth=\"13\" markerHeight=\"13\" refx=\"2\" refy=\"4\"\n",
       "                       orient=\"auto\" markerUnits=\"strokeWidth\">\n",
       "                    <path d=\"M2,2 L2,6 L6,4\" style=\"fill: #000000;\" />\n",
       "                </marker>\n",
       "                <marker id=\"markerReverseArrow\" markerWidth=\"13\" markerHeight=\"13\" refx=\"6\" refy=\"4\"\n",
       "                       orient=\"auto\" markerUnits=\"strokeWidth\">\n",
       "                    <path d=\"M6,2 L6,6 L2,4\" style=\"fill: #000000;\" />\n",
       "                </marker>\n",
       "            </defs><g transform=\"matrix(1,0,0,-1,0,0)\"><ellipse fill=\"#66cc99\" stroke=\"#555555\" stroke-width=\"0.0960000000000000\" opacity=\"0.6\" cx=\"1.00000000000000\" cy=\"0\" rx=\"2.00000000000000\" ry=\"2.00000000000000\"/></g></svg>"
      ],
      "text/latex": [
       "$\\displaystyle \\operatorname{Circle}\\left(\\operatorname{Point2D}\\left(1, 0\\right), 2\\right)$"
      ],
      "text/plain": [
       "Circle(Point2D(1, 0), 2)"
      ]
     },
     "execution_count": 58,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "c1=Circle(Point(1,0),2)\n",
    "c1"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 59,
   "id": "1fca5303",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/svg+xml": [
       "<svg xmlns=\"http://www.w3.org/2000/svg\"\n",
       "            xmlns:xlink=\"http://www.w3.org/1999/xlink\"\n",
       "            width=\"100.0\" height=\"100.0\" viewBox=\"-4.60000000000000 -0.600000000000000 7.20000000000000 7.20000000000000\"\n",
       "            preserveAspectRatio=\"xMinYMin meet\">\n",
       "            <defs>\n",
       "                <marker id=\"markerCircle\" markerWidth=\"8\" markerHeight=\"8\"\n",
       "                    refx=\"5\" refy=\"5\" markerUnits=\"strokeWidth\">\n",
       "                    <circle cx=\"5\" cy=\"5\" r=\"1.5\" style=\"stroke: none; fill:#000000;\"/>\n",
       "                </marker>\n",
       "                <marker id=\"markerArrow\" markerWidth=\"13\" markerHeight=\"13\" refx=\"2\" refy=\"4\"\n",
       "                       orient=\"auto\" markerUnits=\"strokeWidth\">\n",
       "                    <path d=\"M2,2 L2,6 L6,4\" style=\"fill: #000000;\" />\n",
       "                </marker>\n",
       "                <marker id=\"markerReverseArrow\" markerWidth=\"13\" markerHeight=\"13\" refx=\"6\" refy=\"4\"\n",
       "                       orient=\"auto\" markerUnits=\"strokeWidth\">\n",
       "                    <path d=\"M6,2 L6,6 L2,4\" style=\"fill: #000000;\" />\n",
       "                </marker>\n",
       "            </defs><g transform=\"matrix(1,0,0,-1,0,6.00000000000000)\"><ellipse fill=\"#66cc99\" stroke=\"#555555\" stroke-width=\"0.144000000000000\" opacity=\"0.6\" cx=\"-1.00000000000000\" cy=\"3.00000000000000\" rx=\"3.00000000000000\" ry=\"3.00000000000000\"/></g></svg>"
      ],
      "text/latex": [
       "$\\displaystyle \\operatorname{Circle}\\left(\\operatorname{Point2D}\\left(-1, 3\\right), 3\\right)$"
      ],
      "text/plain": [
       "Circle(Point2D(-1, 3), 3)"
      ]
     },
     "execution_count": 59,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "c2=Circle(Point(-1,3),3)\n",
    "c2"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 60,
   "id": "261637e0",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle y^{2} + \\left(x - 1\\right)^{2} - 4$"
      ],
      "text/plain": [
       "y**2 + (x - 1)**2 - 4"
      ]
     },
     "execution_count": 60,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "c1.equation()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 61,
   "id": "1553a258",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\left(x + 1\\right)^{2} + \\left(y - 3\\right)^{2} - 9$"
      ],
      "text/plain": [
       "(x + 1)**2 + (y - 3)**2 - 9"
      ]
     },
     "execution_count": 61,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "c2.equation()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 62,
   "id": "fdd0f29e",
   "metadata": {},
   "outputs": [],
   "source": [
    "M,N=Intersection(c1,c2)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 63,
   "id": "d414e7a7",
   "metadata": {},
   "outputs": [],
   "source": [
    "l=Line(M,N)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 64,
   "id": "b97bea3f",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/svg+xml": [
       "<svg xmlns=\"http://www.w3.org/2000/svg\"\n",
       "            xmlns:xlink=\"http://www.w3.org/1999/xlink\"\n",
       "            width=\"100.0\" height=\"100.0\" viewBox=\"-1.27692307692308 -0.276923076923077 3.32307692307692 2.40000000000000\"\n",
       "            preserveAspectRatio=\"xMinYMin meet\">\n",
       "            <defs>\n",
       "                <marker id=\"markerCircle\" markerWidth=\"8\" markerHeight=\"8\"\n",
       "                    refx=\"5\" refy=\"5\" markerUnits=\"strokeWidth\">\n",
       "                    <circle cx=\"5\" cy=\"5\" r=\"1.5\" style=\"stroke: none; fill:#000000;\"/>\n",
       "                </marker>\n",
       "                <marker id=\"markerArrow\" markerWidth=\"13\" markerHeight=\"13\" refx=\"2\" refy=\"4\"\n",
       "                       orient=\"auto\" markerUnits=\"strokeWidth\">\n",
       "                    <path d=\"M2,2 L2,6 L6,4\" style=\"fill: #000000;\" />\n",
       "                </marker>\n",
       "                <marker id=\"markerReverseArrow\" markerWidth=\"13\" markerHeight=\"13\" refx=\"6\" refy=\"4\"\n",
       "                       orient=\"auto\" markerUnits=\"strokeWidth\">\n",
       "                    <path d=\"M6,2 L6,6 L2,4\" style=\"fill: #000000;\" />\n",
       "                </marker>\n",
       "            </defs><g transform=\"matrix(1,0,0,-1,0,1.84615384615385)\"><path fill-rule=\"evenodd\" fill=\"#66cc99\" stroke=\"#555555\" stroke-width=\"0.0664615384615385\" opacity=\"0.6\" d=\"M -1.00000000000000,0 L 1.76923076923077,1.84615384615385\" marker-start=\"url(#markerReverseArrow)\" marker-end=\"url(#markerArrow)\"/></g></svg>"
      ],
      "text/latex": [
       "$\\displaystyle \\operatorname{Line2D}\\left(\\operatorname{Point2D}\\left(-1, 0\\right), \\operatorname{Point2D}\\left(\\frac{23}{13}, \\frac{24}{13}\\right)\\right)$"
      ],
      "text/plain": [
       "Line2D(Point2D(-1, 0), Point2D(23/13, 24/13))"
      ]
     },
     "execution_count": 64,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "l"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 66,
   "id": "41c7c639",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle - \\frac{12 \\cdot \\left(2 x - 3 y + 2\\right)}{13}$"
      ],
      "text/plain": [
       "-12*(2*x - 3*y + 2)/13"
      ]
     },
     "execution_count": 66,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "factor(l.equation())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 68,
   "id": "a6cb5624",
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "image/svg+xml": [
       "<svg xmlns=\"http://www.w3.org/2000/svg\"\n",
       "            xmlns:xlink=\"http://www.w3.org/1999/xlink\"\n",
       "            width=\"100.0\" height=\"100.0\" viewBox=\"-2.40000000000000 -2.40000000000000 4.80000000000000 4.80000000000000\"\n",
       "            preserveAspectRatio=\"xMinYMin meet\">\n",
       "            <defs>\n",
       "                <marker id=\"markerCircle\" markerWidth=\"8\" markerHeight=\"8\"\n",
       "                    refx=\"5\" refy=\"5\" markerUnits=\"strokeWidth\">\n",
       "                    <circle cx=\"5\" cy=\"5\" r=\"1.5\" style=\"stroke: none; fill:#000000;\"/>\n",
       "                </marker>\n",
       "                <marker id=\"markerArrow\" markerWidth=\"13\" markerHeight=\"13\" refx=\"2\" refy=\"4\"\n",
       "                       orient=\"auto\" markerUnits=\"strokeWidth\">\n",
       "                    <path d=\"M2,2 L2,6 L6,4\" style=\"fill: #000000;\" />\n",
       "                </marker>\n",
       "                <marker id=\"markerReverseArrow\" markerWidth=\"13\" markerHeight=\"13\" refx=\"6\" refy=\"4\"\n",
       "                       orient=\"auto\" markerUnits=\"strokeWidth\">\n",
       "                    <path d=\"M6,2 L6,6 L2,4\" style=\"fill: #000000;\" />\n",
       "                </marker>\n",
       "            </defs><g transform=\"matrix(1,0,0,-1,0,0)\"><ellipse fill=\"#66cc99\" stroke=\"#555555\" stroke-width=\"0.0960000000000000\" opacity=\"0.6\" cx=\"0\" cy=\"0\" rx=\"2.00000000000000\" ry=\"2.00000000000000\"/></g></svg>"
      ],
      "text/latex": [
       "$\\displaystyle \\operatorname{Circle}\\left(\\operatorname{Point2D}\\left(0, 0\\right), 2\\right)$"
      ],
      "text/plain": [
       "Circle(Point2D(0, 0), 2)"
      ]
     },
     "execution_count": 68,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "c3=Circle(Point(0,0),2)\n",
    "c3"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 69,
   "id": "32d2af5c",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle x^{2} + y^{2} - 4$"
      ],
      "text/plain": [
       "x**2 + y**2 - 4"
      ]
     },
     "execution_count": 69,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "c3.equation()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 70,
   "id": "65ba5944",
   "metadata": {},
   "outputs": [],
   "source": [
    "P,Q=Intersection(c3,l)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 71,
   "id": "727c2ffb",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\operatorname{Point2D}\\left(- \\frac{4}{13} + \\frac{12 \\sqrt{3}}{13}, \\frac{6}{13} + \\frac{8 \\sqrt{3}}{13}\\right)$"
      ],
      "text/plain": [
       "Point2D(-4/13 + 12*sqrt(3)/13, 6/13 + 8*sqrt(3)/13)"
      ]
     },
     "execution_count": 71,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "P"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 72,
   "id": "7381051d",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\operatorname{Point2D}\\left(- \\frac{12 \\sqrt{3}}{13} - \\frac{4}{13}, \\frac{6}{13} - \\frac{8 \\sqrt{3}}{13}\\right)$"
      ],
      "text/plain": [
       "Point2D(-12*sqrt(3)/13 - 4/13, 6/13 - 8*sqrt(3)/13)"
      ]
     },
     "execution_count": 72,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "Q"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 73,
   "id": "57f5b54e",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\frac{8 \\sqrt{39}}{13}$"
      ],
      "text/plain": [
       "8*sqrt(39)/13"
      ]
     },
     "execution_count": 73,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "P.distance(Q)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 74,
   "id": "29ee03c5",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\frac{2 \\sqrt{13}}{13}$"
      ],
      "text/plain": [
       "2*sqrt(13)/13"
      ]
     },
     "execution_count": 74,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "c3.center.distance(l)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 75,
   "id": "f1901c39",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/svg+xml": [
       "<svg xmlns=\"http://www.w3.org/2000/svg\"\n",
       "            xmlns:xlink=\"http://www.w3.org/1999/xlink\"\n",
       "            width=\"100.0\" height=\"100.0\" viewBox=\"-3.60000000000000 -3.60000000000000 7.20000000000000 7.20000000000000\"\n",
       "            preserveAspectRatio=\"xMinYMin meet\">\n",
       "            <defs>\n",
       "                <marker id=\"markerCircle\" markerWidth=\"8\" markerHeight=\"8\"\n",
       "                    refx=\"5\" refy=\"5\" markerUnits=\"strokeWidth\">\n",
       "                    <circle cx=\"5\" cy=\"5\" r=\"1.5\" style=\"stroke: none; fill:#000000;\"/>\n",
       "                </marker>\n",
       "                <marker id=\"markerArrow\" markerWidth=\"13\" markerHeight=\"13\" refx=\"2\" refy=\"4\"\n",
       "                       orient=\"auto\" markerUnits=\"strokeWidth\">\n",
       "                    <path d=\"M2,2 L2,6 L6,4\" style=\"fill: #000000;\" />\n",
       "                </marker>\n",
       "                <marker id=\"markerReverseArrow\" markerWidth=\"13\" markerHeight=\"13\" refx=\"6\" refy=\"4\"\n",
       "                       orient=\"auto\" markerUnits=\"strokeWidth\">\n",
       "                    <path d=\"M6,2 L6,6 L2,4\" style=\"fill: #000000;\" />\n",
       "                </marker>\n",
       "            </defs><g transform=\"matrix(1,0,0,-1,0,0)\"><ellipse fill=\"#66cc99\" stroke=\"#555555\" stroke-width=\"0.144000000000000\" opacity=\"0.6\" cx=\"0\" cy=\"0\" rx=\"3.00000000000000\" ry=\"3.00000000000000\"/></g></svg>"
      ],
      "text/latex": [
       "$\\displaystyle \\operatorname{Circle}\\left(\\operatorname{Point2D}\\left(0, 0\\right), 3\\right)$"
      ],
      "text/plain": [
       "Circle(Point2D(0, 0), 3)"
      ]
     },
     "execution_count": 75,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "c1=Circle(Point(0,0),3)\n",
    "c1"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 76,
   "id": "ed520435",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/svg+xml": [
       "<svg xmlns=\"http://www.w3.org/2000/svg\"\n",
       "            xmlns:xlink=\"http://www.w3.org/1999/xlink\"\n",
       "            width=\"100.0\" height=\"100.0\" viewBox=\"0.600000000000000 -6.40000000000000 4.80000000000000 4.80000000000000\"\n",
       "            preserveAspectRatio=\"xMinYMin meet\">\n",
       "            <defs>\n",
       "                <marker id=\"markerCircle\" markerWidth=\"8\" markerHeight=\"8\"\n",
       "                    refx=\"5\" refy=\"5\" markerUnits=\"strokeWidth\">\n",
       "                    <circle cx=\"5\" cy=\"5\" r=\"1.5\" style=\"stroke: none; fill:#000000;\"/>\n",
       "                </marker>\n",
       "                <marker id=\"markerArrow\" markerWidth=\"13\" markerHeight=\"13\" refx=\"2\" refy=\"4\"\n",
       "                       orient=\"auto\" markerUnits=\"strokeWidth\">\n",
       "                    <path d=\"M2,2 L2,6 L6,4\" style=\"fill: #000000;\" />\n",
       "                </marker>\n",
       "                <marker id=\"markerReverseArrow\" markerWidth=\"13\" markerHeight=\"13\" refx=\"6\" refy=\"4\"\n",
       "                       orient=\"auto\" markerUnits=\"strokeWidth\">\n",
       "                    <path d=\"M6,2 L6,6 L2,4\" style=\"fill: #000000;\" />\n",
       "                </marker>\n",
       "            </defs><g transform=\"matrix(1,0,0,-1,0,-8.00000000000000)\"><ellipse fill=\"#66cc99\" stroke=\"#555555\" stroke-width=\"0.0960000000000000\" opacity=\"0.6\" cx=\"3.00000000000000\" cy=\"-4.00000000000000\" rx=\"2.00000000000000\" ry=\"2.00000000000000\"/></g></svg>"
      ],
      "text/latex": [
       "$\\displaystyle \\operatorname{Circle}\\left(\\operatorname{Point2D}\\left(3, -4\\right), 2\\right)$"
      ],
      "text/plain": [
       "Circle(Point2D(3, -4), 2)"
      ]
     },
     "execution_count": 76,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "c2=Circle(x**2+y**2-6*x+8*y+21)\n",
    "c2"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 77,
   "id": "fc76cd5b",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/svg+xml": [
       "<svg xmlns=\"http://www.w3.org/2000/svg\"\n",
       "            xmlns:xlink=\"http://www.w3.org/1999/xlink\"\n",
       "            width=\"100.0\" height=\"100.0\" viewBox=\"-0.100000000000000 -0.100000000000000 1.20000000000000 0.700000000000000\"\n",
       "            preserveAspectRatio=\"xMinYMin meet\">\n",
       "            <defs>\n",
       "                <marker id=\"markerCircle\" markerWidth=\"8\" markerHeight=\"8\"\n",
       "                    refx=\"5\" refy=\"5\" markerUnits=\"strokeWidth\">\n",
       "                    <circle cx=\"5\" cy=\"5\" r=\"1.5\" style=\"stroke: none; fill:#000000;\"/>\n",
       "                </marker>\n",
       "                <marker id=\"markerArrow\" markerWidth=\"13\" markerHeight=\"13\" refx=\"2\" refy=\"4\"\n",
       "                       orient=\"auto\" markerUnits=\"strokeWidth\">\n",
       "                    <path d=\"M2,2 L2,6 L6,4\" style=\"fill: #000000;\" />\n",
       "                </marker>\n",
       "                <marker id=\"markerReverseArrow\" markerWidth=\"13\" markerHeight=\"13\" refx=\"6\" refy=\"4\"\n",
       "                       orient=\"auto\" markerUnits=\"strokeWidth\">\n",
       "                    <path d=\"M6,2 L6,6 L2,4\" style=\"fill: #000000;\" />\n",
       "                </marker>\n",
       "            </defs><g transform=\"matrix(1,0,0,-1,0,0.500000000000000)\"><path fill-rule=\"evenodd\" fill=\"#66cc99\" stroke=\"#555555\" stroke-width=\"0.0240000000000000\" opacity=\"0.6\" d=\"M 0,0.500000000000000 L 1.00000000000000,0\" marker-start=\"url(#markerReverseArrow)\" marker-end=\"url(#markerArrow)\"/></g></svg>"
      ],
      "text/latex": [
       "$\\displaystyle \\operatorname{Line2D}\\left(\\operatorname{Point2D}\\left(0, \\frac{1}{2}\\right), \\operatorname{Point2D}\\left(1, 0\\right)\\right)$"
      ],
      "text/plain": [
       "Line2D(Point2D(0, 1/2), Point2D(1, 0))"
      ]
     },
     "execution_count": 77,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "l=Line(x+2*y-1)\n",
    "l"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 78,
   "id": "b19be0c6",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\left\\{\\operatorname{Point2D}\\left(\\frac{1}{5} - \\frac{4 \\sqrt{11}}{5}, \\frac{2}{5} + \\frac{2 \\sqrt{11}}{5}\\right), \\operatorname{Point2D}\\left(\\frac{1}{5} + \\frac{4 \\sqrt{11}}{5}, \\frac{2}{5} - \\frac{2 \\sqrt{11}}{5}\\right)\\right\\}$"
      ],
      "text/plain": [
       "{Point2D(1/5 - 4*sqrt(11)/5, 2/5 + 2*sqrt(11)/5), Point2D(1/5 + 4*sqrt(11)/5, 2/5 - 2*sqrt(11)/5)}"
      ]
     },
     "execution_count": 78,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "Intersection(l,c1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 79,
   "id": "2cb7ba6d",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\frac{\\sqrt{5}}{5}$"
      ],
      "text/plain": [
       "sqrt(5)/5"
      ]
     },
     "execution_count": 79,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "l.distance(c1.center)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 80,
   "id": "28f91aa7",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle 3$"
      ],
      "text/plain": [
       "3"
      ]
     },
     "execution_count": 80,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "c1.radius"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 81,
   "id": "d41cbcf3",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\left\\{\\operatorname{Point2D}\\left(\\frac{9}{5}, - \\frac{12}{5}\\right)\\right\\}$"
      ],
      "text/plain": [
       "{Point2D(9/5, -12/5)}"
      ]
     },
     "execution_count": 81,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "Intersection(c1,c2)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 82,
   "id": "38543ecf",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle 5$"
      ],
      "text/plain": [
       "5"
      ]
     },
     "execution_count": 82,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "c1.center.distance(c2.center)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 83,
   "id": "ba5581b6",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle 2$"
      ],
      "text/plain": [
       "2"
      ]
     },
     "execution_count": 83,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "c2.radius"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 84,
   "id": "7e8c3876",
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\left\\{61 - \\left(5 - \\sqrt{11}\\right)^{2}\\right\\}$"
      ],
      "text/plain": [
       "{61 - (5 - sqrt(11))**2}"
      ]
     },
     "execution_count": 84,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "solveset(5-sqrt(11)-sqrt(61-x),x,Reals)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 85,
   "id": "7c134e56",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\left\\{25 + 10 \\sqrt{11}\\right\\}$"
      ],
      "text/plain": [
       "{25 + 10*sqrt(11)}"
      ]
     },
     "execution_count": 85,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "simplify(_)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 86,
   "id": "17258abb",
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\left\\{61 - \\left(\\sqrt{11} + 5\\right)^{2}\\right\\}$"
      ],
      "text/plain": [
       "{61 - (sqrt(11) + 5)**2}"
      ]
     },
     "execution_count": 86,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "solveset(5+sqrt(11)-sqrt(61-x),x,Reals)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 87,
   "id": "28340626",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\left\\{25 - 10 \\sqrt{11}\\right\\}$"
      ],
      "text/plain": [
       "{25 - 10*sqrt(11)}"
      ]
     },
     "execution_count": 87,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "simplify(_)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 88,
   "id": "719f73af",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\frac{4 x^{2}}{3} - \\frac{4 x}{3} + \\frac{4 y^{2}}{3} - \\frac{4 y}{3} - 4$"
      ],
      "text/plain": [
       "4*x**2/3 - 4*x/3 + 4*y**2/3 - 4*y/3 - 4"
      ]
     },
     "execution_count": 88,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "expr=x**2+y**2-2*y-4+Rational(1,3)*(x**2+y**2-4*x+2*y)\n",
    "expr"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 89,
   "id": "0c617d88",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\frac{4 \\left(x^{2} - x + y^{2} - y - 3\\right)}{3}$"
      ],
      "text/plain": [
       "4*(x**2 - x + y**2 - y - 3)/3"
      ]
     },
     "execution_count": 89,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "factor(expr)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 90,
   "id": "65efa7fc",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle x^{2} + y^{2} - 2 y - 4$"
      ],
      "text/plain": [
       "x**2 + y**2 - 2*y - 4"
      ]
     },
     "execution_count": 90,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "x**2+y**2-2*y-4"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 92,
   "id": "bc116e7f",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle x^{2} - 4 x + y^{2} + 2 y$"
      ],
      "text/plain": [
       "x**2 - 4*x + y**2 + 2*y"
      ]
     },
     "execution_count": 92,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "(x**2+y**2-4*x+2*y)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 93,
   "id": "8fbd4b34",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\text{True}$"
      ],
      "text/plain": [
       "True"
      ]
     },
     "execution_count": 93,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "5*sqrt(2)-sqrt(10)<2*sqrt(5)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 94,
   "id": "10ad9852",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\text{True}$"
      ],
      "text/plain": [
       "True"
      ]
     },
     "execution_count": 94,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "5*sqrt(2)+sqrt(10)>2*sqrt(5)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 96,
   "id": "5b4b7811",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\left(2 x - \\pi\\right) \\cos{\\left(x \\right)} + \\sin{\\left(x \\right)}$"
      ],
      "text/plain": [
       "(2*x - pi)*cos(x) + sin(x)"
      ]
     },
     "execution_count": 96,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "expr=(2*x-pi)*sin(pi/2-x)+cos(x-pi/2)\n",
    "expr"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 98,
   "id": "2d3ddb2e",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\left\\{x\\; \\middle|\\; x \\in \\left(- 2 \\pi, 3 \\pi\\right) \\wedge \\left(2 x - \\pi\\right) \\cos{\\left(x \\right)} + \\sin{\\left(x \\right)} = 0 \\right\\}$"
      ],
      "text/plain": [
       "ConditionSet(x, Eq((2*x - pi)*cos(x) + sin(x), 0), Interval.open(-2*pi, 3*pi))"
      ]
     },
     "execution_count": 98,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "solveset(expr,x,Interval.open(-2*pi,3*pi))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 99,
   "id": "88c0ac5f",
   "metadata": {
    "collapsed": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Help on function rsolve in module sympy.solvers.recurr:\n",
      "\n",
      "rsolve(f, y, init=None)\n",
      "    Solve univariate recurrence with rational coefficients.\n",
      "    \n",
      "    Given `k`-th order linear recurrence `\\operatorname{L} y = f`,\n",
      "    or equivalently:\n",
      "    \n",
      "    .. math:: a_{k}(n) y(n+k) + a_{k-1}(n) y(n+k-1) +\n",
      "              \\cdots + a_{0}(n) y(n) = f(n)\n",
      "    \n",
      "    where `a_{i}(n)`, for `i=0, \\ldots, k`, are polynomials or rational\n",
      "    functions in `n`, and `f` is a hypergeometric function or a sum\n",
      "    of a fixed number of pairwise dissimilar hypergeometric terms in\n",
      "    `n`, finds all solutions or returns ``None``, if none were found.\n",
      "    \n",
      "    Initial conditions can be given as a dictionary in two forms:\n",
      "    \n",
      "        (1) ``{  n_0  : v_0,   n_1  : v_1, ...,   n_m  : v_m}``\n",
      "        (2) ``{y(n_0) : v_0, y(n_1) : v_1, ..., y(n_m) : v_m}``\n",
      "    \n",
      "    or as a list ``L`` of values:\n",
      "    \n",
      "        ``L = [v_0, v_1, ..., v_m]``\n",
      "    \n",
      "    where ``L[i] = v_i``, for `i=0, \\ldots, m`, maps to `y(n_i)`.\n",
      "    \n",
      "    Examples\n",
      "    ========\n",
      "    \n",
      "    Lets consider the following recurrence:\n",
      "    \n",
      "    .. math:: (n - 1) y(n + 2) - (n^2 + 3 n - 2) y(n + 1) +\n",
      "              2 n (n + 1) y(n) = 0\n",
      "    \n",
      "    >>> from sympy import Function, rsolve\n",
      "    >>> from sympy.abc import n\n",
      "    >>> y = Function('y')\n",
      "    \n",
      "    >>> f = (n - 1)*y(n + 2) - (n**2 + 3*n - 2)*y(n + 1) + 2*n*(n + 1)*y(n)\n",
      "    \n",
      "    >>> rsolve(f, y(n))\n",
      "    2**n*C0 + C1*factorial(n)\n",
      "    \n",
      "    >>> rsolve(f, y(n), {y(0):0, y(1):3})\n",
      "    3*2**n - 3*factorial(n)\n",
      "    \n",
      "    See Also\n",
      "    ========\n",
      "    \n",
      "    rsolve_poly, rsolve_ratio, rsolve_hyper\n",
      "\n"
     ]
    }
   ],
   "source": [
    "help(rsolve)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 100,
   "id": "f49173b7",
   "metadata": {},
   "outputs": [],
   "source": [
    "f=Function(\"f\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 104,
   "id": "e208ec55",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle - \\frac{\\sqrt{5} \\left(\\frac{1}{2} - \\frac{\\sqrt{5}}{2}\\right)^{n}}{5} + \\frac{\\sqrt{5} \\left(\\frac{1}{2} + \\frac{\\sqrt{5}}{2}\\right)^{n}}{5}$"
      ],
      "text/plain": [
       "-sqrt(5)*(1/2 - sqrt(5)/2)**n/5 + sqrt(5)*(1/2 + sqrt(5)/2)**n/5"
      ]
     },
     "execution_count": 104,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "rsolve(f(n-1)+f(n)-f(n+1),f(n),{f(1):1,f(2):1})"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 109,
   "id": "fc7f70c2",
   "metadata": {},
   "outputs": [],
   "source": [
    "Q=symbols(\"Q\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 111,
   "id": "be37bea2",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle - \\frac{\\left(\\frac{1}{2} - \\frac{\\sqrt{4 Q + 1}}{2}\\right)^{n}}{\\sqrt{4 Q + 1}} + \\left(\\frac{\\sqrt{4 Q + 1}}{2} + \\frac{1}{2}\\right)^{n} \\left(\\frac{2 Q}{2 Q \\sqrt{4 Q + 1} + 4 Q + \\sqrt{4 Q + 1} + 1} + \\frac{\\sqrt{4 Q + 1}}{2 Q \\sqrt{4 Q + 1} + 4 Q + \\sqrt{4 Q + 1} + 1} + \\frac{1}{2 Q \\sqrt{4 Q + 1} + 4 Q + \\sqrt{4 Q + 1} + 1}\\right)$"
      ],
      "text/plain": [
       "-(1/2 - sqrt(4*Q + 1)/2)**n/sqrt(4*Q + 1) + (sqrt(4*Q + 1)/2 + 1/2)**n*(2*Q/(2*Q*sqrt(4*Q + 1) + 4*Q + sqrt(4*Q + 1) + 1) + sqrt(4*Q + 1)/(2*Q*sqrt(4*Q + 1) + 4*Q + sqrt(4*Q + 1) + 1) + 1/(2*Q*sqrt(4*Q + 1) + 4*Q + sqrt(4*Q + 1) + 1))"
      ]
     },
     "execution_count": 111,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "expr=rsolve(Q*f(n-1)+f(n)-f(n+1),f(n),{f(1):1,f(2):1})\n",
    "expr"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 113,
   "id": "e8dbc5ad",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle - \\frac{\\left(-2\\right)^{n}}{5} + \\frac{3^{n}}{5}$"
      ],
      "text/plain": [
       "-(-2)**n/5 + 3**n/5"
      ]
     },
     "execution_count": 113,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "expr.subs(Q,6)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 115,
   "id": "14e49190",
   "metadata": {},
   "outputs": [],
   "source": [
    "from sympy import N"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 116,
   "id": "b5a313ac",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle 19.5711570428575$"
      ],
      "text/plain": [
       "19.5711570428575"
      ]
     },
     "execution_count": 116,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "N(12*log(6,3))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 117,
   "id": "ddac2f75",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\left(-\\infty, -2\\right) \\cup \\left(0, \\infty\\right)$"
      ],
      "text/plain": [
       "Union(Interval.open(-oo, -2), Interval.open(0, oo))"
      ]
     },
     "execution_count": 117,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "solveset(abs(2*x+1)>abs(x-1),x,Reals)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 119,
   "id": "f6b74f37",
   "metadata": {
    "collapsed": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Help on class Parabola in module sympy.geometry.parabola:\n",
      "\n",
      "class Parabola(sympy.geometry.entity.GeometrySet)\n",
      " |  Parabola(focus=None, directrix=None, **kwargs)\n",
      " |  \n",
      " |  A parabolic GeometryEntity.\n",
      " |  \n",
      " |  A parabola is declared with a point, that is called 'focus', and\n",
      " |  a line, that is called 'directrix'.\n",
      " |  Only vertical or horizontal parabolas are currently supported.\n",
      " |  \n",
      " |  Parameters\n",
      " |  ==========\n",
      " |  \n",
      " |  focus : Point\n",
      " |      Default value is Point(0, 0)\n",
      " |  directrix : Line\n",
      " |  \n",
      " |  Attributes\n",
      " |  ==========\n",
      " |  \n",
      " |  focus\n",
      " |  directrix\n",
      " |  axis of symmetry\n",
      " |  focal length\n",
      " |  p parameter\n",
      " |  vertex\n",
      " |  eccentricity\n",
      " |  \n",
      " |  Raises\n",
      " |  ======\n",
      " |  ValueError\n",
      " |      When `focus` is not a two dimensional point.\n",
      " |      When `focus` is a point of directrix.\n",
      " |  NotImplementedError\n",
      " |      When `directrix` is neither horizontal nor vertical.\n",
      " |  \n",
      " |  Examples\n",
      " |  ========\n",
      " |  \n",
      " |  >>> from sympy import Parabola, Point, Line\n",
      " |  >>> p1 = Parabola(Point(0, 0), Line(Point(5, 8), Point(7,8)))\n",
      " |  >>> p1.focus\n",
      " |  Point2D(0, 0)\n",
      " |  >>> p1.directrix\n",
      " |  Line2D(Point2D(5, 8), Point2D(7, 8))\n",
      " |  \n",
      " |  Method resolution order:\n",
      " |      Parabola\n",
      " |      sympy.geometry.entity.GeometrySet\n",
      " |      sympy.geometry.entity.GeometryEntity\n",
      " |      sympy.sets.sets.Set\n",
      " |      sympy.core.basic.Basic\n",
      " |      sympy.printing.defaults.Printable\n",
      " |      sympy.core.evalf.EvalfMixin\n",
      " |      builtins.object\n",
      " |  \n",
      " |  Methods defined here:\n",
      " |  \n",
      " |  equation(self, x='x', y='y')\n",
      " |      The equation of the parabola.\n",
      " |      \n",
      " |      Parameters\n",
      " |      ==========\n",
      " |      x : str, optional\n",
      " |          Label for the x-axis. Default value is 'x'.\n",
      " |      y : str, optional\n",
      " |          Label for the y-axis. Default value is 'y'.\n",
      " |      \n",
      " |      Returns\n",
      " |      =======\n",
      " |      equation : SymPy expression\n",
      " |      \n",
      " |      Examples\n",
      " |      ========\n",
      " |      \n",
      " |      >>> from sympy import Parabola, Point, Line\n",
      " |      >>> p1 = Parabola(Point(0, 0), Line(Point(5, 8), Point(7, 8)))\n",
      " |      >>> p1.equation()\n",
      " |      -x**2 - 16*y + 64\n",
      " |      >>> p1.equation('f')\n",
      " |      -f**2 - 16*y + 64\n",
      " |      >>> p1.equation(y='z')\n",
      " |      -x**2 - 16*z + 64\n",
      " |  \n",
      " |  intersection(self, o)\n",
      " |      The intersection of the parabola and another geometrical entity `o`.\n",
      " |      \n",
      " |      Parameters\n",
      " |      ==========\n",
      " |      \n",
      " |      o : GeometryEntity, LinearEntity\n",
      " |      \n",
      " |      Returns\n",
      " |      =======\n",
      " |      \n",
      " |      intersection : list of GeometryEntity objects\n",
      " |      \n",
      " |      Examples\n",
      " |      ========\n",
      " |      \n",
      " |      >>> from sympy import Parabola, Point, Ellipse, Line, Segment\n",
      " |      >>> p1 = Point(0,0)\n",
      " |      >>> l1 = Line(Point(1, -2), Point(-1,-2))\n",
      " |      >>> parabola1 = Parabola(p1, l1)\n",
      " |      >>> parabola1.intersection(Ellipse(Point(0, 0), 2, 5))\n",
      " |      [Point2D(-2, 0), Point2D(2, 0)]\n",
      " |      >>> parabola1.intersection(Line(Point(-7, 3), Point(12, 3)))\n",
      " |      [Point2D(-4, 3), Point2D(4, 3)]\n",
      " |      >>> parabola1.intersection(Segment((-12, -65), (14, -68)))\n",
      " |      []\n",
      " |  \n",
      " |  ----------------------------------------------------------------------\n",
      " |  Static methods defined here:\n",
      " |  \n",
      " |  __new__(cls, focus=None, directrix=None, **kwargs)\n",
      " |      Create and return a new object.  See help(type) for accurate signature.\n",
      " |  \n",
      " |  ----------------------------------------------------------------------\n",
      " |  Readonly properties defined here:\n",
      " |  \n",
      " |  __sympy__\n",
      " |  \n",
      " |  ambient_dimension\n",
      " |      Returns the ambient dimension of parabola.\n",
      " |      \n",
      " |      Returns\n",
      " |      =======\n",
      " |      \n",
      " |      ambient_dimension : integer\n",
      " |      \n",
      " |      Examples\n",
      " |      ========\n",
      " |      \n",
      " |      >>> from sympy import Parabola, Point, Line\n",
      " |      >>> f1 = Point(0, 0)\n",
      " |      >>> p1 = Parabola(f1, Line(Point(5, 8), Point(7, 8)))\n",
      " |      >>> p1.ambient_dimension\n",
      " |      2\n",
      " |  \n",
      " |  axis_of_symmetry\n",
      " |      Return the axis of symmetry of the parabola: a line\n",
      " |      perpendicular to the directrix passing through the focus.\n",
      " |      \n",
      " |      Returns\n",
      " |      =======\n",
      " |      \n",
      " |      axis_of_symmetry : Line\n",
      " |      \n",
      " |      See Also\n",
      " |      ========\n",
      " |      \n",
      " |      sympy.geometry.line.Line\n",
      " |      \n",
      " |      Examples\n",
      " |      ========\n",
      " |      \n",
      " |      >>> from sympy import Parabola, Point, Line\n",
      " |      >>> p1 = Parabola(Point(0, 0), Line(Point(5, 8), Point(7, 8)))\n",
      " |      >>> p1.axis_of_symmetry\n",
      " |      Line2D(Point2D(0, 0), Point2D(0, 1))\n",
      " |  \n",
      " |  directrix\n",
      " |      The directrix of the parabola.\n",
      " |      \n",
      " |      Returns\n",
      " |      =======\n",
      " |      \n",
      " |      directrix : Line\n",
      " |      \n",
      " |      See Also\n",
      " |      ========\n",
      " |      \n",
      " |      sympy.geometry.line.Line\n",
      " |      \n",
      " |      Examples\n",
      " |      ========\n",
      " |      \n",
      " |      >>> from sympy import Parabola, Point, Line\n",
      " |      >>> l1 = Line(Point(5, 8), Point(7, 8))\n",
      " |      >>> p1 = Parabola(Point(0, 0), l1)\n",
      " |      >>> p1.directrix\n",
      " |      Line2D(Point2D(5, 8), Point2D(7, 8))\n",
      " |  \n",
      " |  eccentricity\n",
      " |      The eccentricity of the parabola.\n",
      " |      \n",
      " |      Returns\n",
      " |      =======\n",
      " |      \n",
      " |      eccentricity : number\n",
      " |      \n",
      " |      A parabola may also be characterized as a conic section with an\n",
      " |      eccentricity of 1. As a consequence of this, all parabolas are\n",
      " |      similar, meaning that while they can be different sizes,\n",
      " |      they are all the same shape.\n",
      " |      \n",
      " |      See Also\n",
      " |      ========\n",
      " |      \n",
      " |      https://en.wikipedia.org/wiki/Parabola\n",
      " |      \n",
      " |      \n",
      " |      Examples\n",
      " |      ========\n",
      " |      \n",
      " |      >>> from sympy import Parabola, Point, Line\n",
      " |      >>> p1 = Parabola(Point(0, 0), Line(Point(5, 8), Point(7, 8)))\n",
      " |      >>> p1.eccentricity\n",
      " |      1\n",
      " |      \n",
      " |      Notes\n",
      " |      -----\n",
      " |      The eccentricity for every Parabola is 1 by definition.\n",
      " |  \n",
      " |  focal_length\n",
      " |      The focal length of the parabola.\n",
      " |      \n",
      " |      Returns\n",
      " |      =======\n",
      " |      \n",
      " |      focal_lenght : number or symbolic expression\n",
      " |      \n",
      " |      Notes\n",
      " |      =====\n",
      " |      \n",
      " |      The distance between the vertex and the focus\n",
      " |      (or the vertex and directrix), measured along the axis\n",
      " |      of symmetry, is the \"focal length\".\n",
      " |      \n",
      " |      See Also\n",
      " |      ========\n",
      " |      \n",
      " |      https://en.wikipedia.org/wiki/Parabola\n",
      " |      \n",
      " |      Examples\n",
      " |      ========\n",
      " |      \n",
      " |      >>> from sympy import Parabola, Point, Line\n",
      " |      >>> p1 = Parabola(Point(0, 0), Line(Point(5, 8), Point(7, 8)))\n",
      " |      >>> p1.focal_length\n",
      " |      4\n",
      " |  \n",
      " |  focus\n",
      " |      The focus of the parabola.\n",
      " |      \n",
      " |      Returns\n",
      " |      =======\n",
      " |      \n",
      " |      focus : Point\n",
      " |      \n",
      " |      See Also\n",
      " |      ========\n",
      " |      \n",
      " |      sympy.geometry.point.Point\n",
      " |      \n",
      " |      Examples\n",
      " |      ========\n",
      " |      \n",
      " |      >>> from sympy import Parabola, Point, Line\n",
      " |      >>> f1 = Point(0, 0)\n",
      " |      >>> p1 = Parabola(f1, Line(Point(5, 8), Point(7, 8)))\n",
      " |      >>> p1.focus\n",
      " |      Point2D(0, 0)\n",
      " |  \n",
      " |  p_parameter\n",
      " |      P is a parameter of parabola.\n",
      " |      \n",
      " |      Returns\n",
      " |      =======\n",
      " |      \n",
      " |      p : number or symbolic expression\n",
      " |      \n",
      " |      Notes\n",
      " |      =====\n",
      " |      \n",
      " |      The absolute value of p is the focal length. The sign on p tells\n",
      " |      which way the parabola faces. Vertical parabolas that open up\n",
      " |      and horizontal that open right, give a positive value for p.\n",
      " |      Vertical parabolas that open down and horizontal that open left,\n",
      " |      give a negative value for p.\n",
      " |      \n",
      " |      \n",
      " |      See Also\n",
      " |      ========\n",
      " |      \n",
      " |      http://www.sparknotes.com/math/precalc/conicsections/section2.rhtml\n",
      " |      \n",
      " |      Examples\n",
      " |      ========\n",
      " |      \n",
      " |      >>> from sympy import Parabola, Point, Line\n",
      " |      >>> p1 = Parabola(Point(0, 0), Line(Point(5, 8), Point(7, 8)))\n",
      " |      >>> p1.p_parameter\n",
      " |      -4\n",
      " |  \n",
      " |  vertex\n",
      " |      The vertex of the parabola.\n",
      " |      \n",
      " |      Returns\n",
      " |      =======\n",
      " |      \n",
      " |      vertex : Point\n",
      " |      \n",
      " |      See Also\n",
      " |      ========\n",
      " |      \n",
      " |      sympy.geometry.point.Point\n",
      " |      \n",
      " |      Examples\n",
      " |      ========\n",
      " |      \n",
      " |      >>> from sympy import Parabola, Point, Line\n",
      " |      >>> p1 = Parabola(Point(0, 0), Line(Point(5, 8), Point(7, 8)))\n",
      " |      >>> p1.vertex\n",
      " |      Point2D(0, 4)\n",
      " |  \n",
      " |  ----------------------------------------------------------------------\n",
      " |  Data descriptors defined here:\n",
      " |  \n",
      " |  __dict__\n",
      " |      dictionary for instance variables (if defined)\n",
      " |  \n",
      " |  __weakref__\n",
      " |      list of weak references to the object (if defined)\n",
      " |  \n",
      " |  ----------------------------------------------------------------------\n",
      " |  Data and other attributes defined here:\n",
      " |  \n",
      " |  default_assumptions = {}\n",
      " |  \n",
      " |  ----------------------------------------------------------------------\n",
      " |  Methods inherited from sympy.geometry.entity.GeometryEntity:\n",
      " |  \n",
      " |  __cmp__(self, other)\n",
      " |      Comparison of two GeometryEntities.\n",
      " |  \n",
      " |  __contains__(self, other)\n",
      " |      Subclasses should implement this method for anything more complex than equality.\n",
      " |  \n",
      " |  __getnewargs__(self)\n",
      " |      Returns a tuple that will be passed to __new__ on unpickling.\n",
      " |  \n",
      " |  __ne__(self, o)\n",
      " |      Test inequality of two geometrical entities.\n",
      " |  \n",
      " |  __radd__(self, a)\n",
      " |      Implementation of reverse add method.\n",
      " |  \n",
      " |  __repr__(self)\n",
      " |      String representation of a GeometryEntity that can be evaluated\n",
      " |      by sympy.\n",
      " |  \n",
      " |  __rmul__(self, a)\n",
      " |      Implementation of reverse multiplication method.\n",
      " |  \n",
      " |  __rsub__(self, a)\n",
      " |      Implementation of reverse subtraction method.\n",
      " |  \n",
      " |  __rtruediv__(self, a)\n",
      " |      Implementation of reverse division method.\n",
      " |  \n",
      " |  __str__(self)\n",
      " |      String representation of a GeometryEntity.\n",
      " |  \n",
      " |  encloses(self, o)\n",
      " |      Return True if o is inside (not on or outside) the boundaries of self.\n",
      " |      \n",
      " |      The object will be decomposed into Points and individual Entities need\n",
      " |      only define an encloses_point method for their class.\n",
      " |      \n",
      " |      See Also\n",
      " |      ========\n",
      " |      \n",
      " |      sympy.geometry.ellipse.Ellipse.encloses_point\n",
      " |      sympy.geometry.polygon.Polygon.encloses_point\n",
      " |      \n",
      " |      Examples\n",
      " |      ========\n",
      " |      \n",
      " |      >>> from sympy import RegularPolygon, Point, Polygon\n",
      " |      >>> t  = Polygon(*RegularPolygon(Point(0, 0), 1, 3).vertices)\n",
      " |      >>> t2 = Polygon(*RegularPolygon(Point(0, 0), 2, 3).vertices)\n",
      " |      >>> t2.encloses(t)\n",
      " |      True\n",
      " |      >>> t.encloses(t2)\n",
      " |      False\n",
      " |  \n",
      " |  equals(self, o)\n",
      " |  \n",
      " |  is_similar(self, other)\n",
      " |      Is this geometrical entity similar to another geometrical entity?\n",
      " |      \n",
      " |      Two entities are similar if a uniform scaling (enlarging or\n",
      " |      shrinking) of one of the entities will allow one to obtain the other.\n",
      " |      \n",
      " |      Notes\n",
      " |      =====\n",
      " |      \n",
      " |      This method is not intended to be used directly but rather\n",
      " |      through the `are_similar` function found in util.py.\n",
      " |      An entity is not required to implement this method.\n",
      " |      If two different types of entities can be similar, it is only\n",
      " |      required that one of them be able to determine this.\n",
      " |      \n",
      " |      See Also\n",
      " |      ========\n",
      " |      \n",
      " |      scale\n",
      " |  \n",
      " |  parameter_value(self, other, t)\n",
      " |      Return the parameter corresponding to the given point.\n",
      " |      Evaluating an arbitrary point of the entity at this parameter\n",
      " |      value will return the given point.\n",
      " |      \n",
      " |      Examples\n",
      " |      ========\n",
      " |      \n",
      " |      >>> from sympy import Line, Point\n",
      " |      >>> from sympy.abc import t\n",
      " |      >>> a = Point(0, 0)\n",
      " |      >>> b = Point(2, 2)\n",
      " |      >>> Line(a, b).parameter_value((1, 1), t)\n",
      " |      {t: 1/2}\n",
      " |      >>> Line(a, b).arbitrary_point(t).subs(_)\n",
      " |      Point2D(1, 1)\n",
      " |  \n",
      " |  reflect(self, line)\n",
      " |      Reflects an object across a line.\n",
      " |      \n",
      " |      Parameters\n",
      " |      ==========\n",
      " |      \n",
      " |      line: Line\n",
      " |      \n",
      " |      Examples\n",
      " |      ========\n",
      " |      \n",
      " |      >>> from sympy import pi, sqrt, Line, RegularPolygon\n",
      " |      >>> l = Line((0, pi), slope=sqrt(2))\n",
      " |      >>> pent = RegularPolygon((1, 2), 1, 5)\n",
      " |      >>> rpent = pent.reflect(l)\n",
      " |      >>> rpent\n",
      " |      RegularPolygon(Point2D(-2*sqrt(2)*pi/3 - 1/3 + 4*sqrt(2)/3, 2/3 + 2*sqrt(2)/3 + 2*pi/3), -1, 5, -atan(2*sqrt(2)) + 3*pi/5)\n",
      " |      \n",
      " |      >>> from sympy import pi, Line, Circle, Point\n",
      " |      >>> l = Line((0, pi), slope=1)\n",
      " |      >>> circ = Circle(Point(0, 0), 5)\n",
      " |      >>> rcirc = circ.reflect(l)\n",
      " |      >>> rcirc\n",
      " |      Circle(Point2D(-pi, pi), -5)\n",
      " |  \n",
      " |  rotate(self, angle, pt=None)\n",
      " |      Rotate ``angle`` radians counterclockwise about Point ``pt``.\n",
      " |      \n",
      " |      The default pt is the origin, Point(0, 0)\n",
      " |      \n",
      " |      See Also\n",
      " |      ========\n",
      " |      \n",
      " |      scale, translate\n",
      " |      \n",
      " |      Examples\n",
      " |      ========\n",
      " |      \n",
      " |      >>> from sympy import Point, RegularPolygon, Polygon, pi\n",
      " |      >>> t = Polygon(*RegularPolygon(Point(0, 0), 1, 3).vertices)\n",
      " |      >>> t # vertex on x axis\n",
      " |      Triangle(Point2D(1, 0), Point2D(-1/2, sqrt(3)/2), Point2D(-1/2, -sqrt(3)/2))\n",
      " |      >>> t.rotate(pi/2) # vertex on y axis now\n",
      " |      Triangle(Point2D(0, 1), Point2D(-sqrt(3)/2, -1/2), Point2D(sqrt(3)/2, -1/2))\n",
      " |  \n",
      " |  scale(self, x=1, y=1, pt=None)\n",
      " |      Scale the object by multiplying the x,y-coordinates by x and y.\n",
      " |      \n",
      " |      If pt is given, the scaling is done relative to that point; the\n",
      " |      object is shifted by -pt, scaled, and shifted by pt.\n",
      " |      \n",
      " |      See Also\n",
      " |      ========\n",
      " |      \n",
      " |      rotate, translate\n",
      " |      \n",
      " |      Examples\n",
      " |      ========\n",
      " |      \n",
      " |      >>> from sympy import RegularPolygon, Point, Polygon\n",
      " |      >>> t = Polygon(*RegularPolygon(Point(0, 0), 1, 3).vertices)\n",
      " |      >>> t\n",
      " |      Triangle(Point2D(1, 0), Point2D(-1/2, sqrt(3)/2), Point2D(-1/2, -sqrt(3)/2))\n",
      " |      >>> t.scale(2)\n",
      " |      Triangle(Point2D(2, 0), Point2D(-1, sqrt(3)/2), Point2D(-1, -sqrt(3)/2))\n",
      " |      >>> t.scale(2, 2)\n",
      " |      Triangle(Point2D(2, 0), Point2D(-1, sqrt(3)), Point2D(-1, -sqrt(3)))\n",
      " |  \n",
      " |  translate(self, x=0, y=0)\n",
      " |      Shift the object by adding to the x,y-coordinates the values x and y.\n",
      " |      \n",
      " |      See Also\n",
      " |      ========\n",
      " |      \n",
      " |      rotate, scale\n",
      " |      \n",
      " |      Examples\n",
      " |      ========\n",
      " |      \n",
      " |      >>> from sympy import RegularPolygon, Point, Polygon\n",
      " |      >>> t = Polygon(*RegularPolygon(Point(0, 0), 1, 3).vertices)\n",
      " |      >>> t\n",
      " |      Triangle(Point2D(1, 0), Point2D(-1/2, sqrt(3)/2), Point2D(-1/2, -sqrt(3)/2))\n",
      " |      >>> t.translate(2)\n",
      " |      Triangle(Point2D(3, 0), Point2D(3/2, sqrt(3)/2), Point2D(3/2, -sqrt(3)/2))\n",
      " |      >>> t.translate(2, 2)\n",
      " |      Triangle(Point2D(3, 2), Point2D(3/2, sqrt(3)/2 + 2), Point2D(3/2, 2 - sqrt(3)/2))\n",
      " |  \n",
      " |  ----------------------------------------------------------------------\n",
      " |  Readonly properties inherited from sympy.geometry.entity.GeometryEntity:\n",
      " |  \n",
      " |  bounds\n",
      " |      Return a tuple (xmin, ymin, xmax, ymax) representing the bounding\n",
      " |      rectangle for the geometric figure.\n",
      " |  \n",
      " |  ----------------------------------------------------------------------\n",
      " |  Methods inherited from sympy.sets.sets.Set:\n",
      " |  \n",
      " |  __add__(self, other)\n",
      " |  \n",
      " |  __and__(self, other)\n",
      " |  \n",
      " |  __mul__(self, other)\n",
      " |  \n",
      " |  __or__(self, other)\n",
      " |  \n",
      " |  __pow__(self, exp)\n",
      " |  \n",
      " |  __sub__(self, other)\n",
      " |  \n",
      " |  __xor__(self, other)\n",
      " |  \n",
      " |  complement(self, universe)\n",
      " |      The complement of 'self' w.r.t the given universe.\n",
      " |      \n",
      " |      Examples\n",
      " |      ========\n",
      " |      \n",
      " |      >>> from sympy import Interval, S\n",
      " |      >>> Interval(0, 1).complement(S.Reals)\n",
      " |      Union(Interval.open(-oo, 0), Interval.open(1, oo))\n",
      " |      \n",
      " |      >>> Interval(0, 1).complement(S.UniversalSet)\n",
      " |      Complement(UniversalSet, Interval(0, 1))\n",
      " |  \n",
      " |  contains(self, other)\n",
      " |      Returns a SymPy value indicating whether ``other`` is contained\n",
      " |      in ``self``: ``true`` if it is, ``false`` if it is not, else\n",
      " |      an unevaluated ``Contains`` expression (or, as in the case of\n",
      " |      ConditionSet and a union of FiniteSet/Intervals, an expression\n",
      " |      indicating the conditions for containment).\n",
      " |      \n",
      " |      Examples\n",
      " |      ========\n",
      " |      \n",
      " |      >>> from sympy import Interval, S\n",
      " |      >>> from sympy.abc import x\n",
      " |      \n",
      " |      >>> Interval(0, 1).contains(0.5)\n",
      " |      True\n",
      " |      \n",
      " |      As a shortcut it is possible to use the ``in`` operator, but that\n",
      " |      will raise an error unless an affirmative true or false is not\n",
      " |      obtained.\n",
      " |      \n",
      " |      >>> Interval(0, 1).contains(x)\n",
      " |      (0 <= x) & (x <= 1)\n",
      " |      >>> x in Interval(0, 1)\n",
      " |      Traceback (most recent call last):\n",
      " |      ...\n",
      " |      TypeError: did not evaluate to a bool: None\n",
      " |      \n",
      " |      The result of 'in' is a bool, not a SymPy value\n",
      " |      \n",
      " |      >>> 1 in Interval(0, 2)\n",
      " |      True\n",
      " |      >>> _ is S.true\n",
      " |      False\n",
      " |  \n",
      " |  intersect(self, other)\n",
      " |      Returns the intersection of 'self' and 'other'.\n",
      " |      \n",
      " |      Examples\n",
      " |      ========\n",
      " |      \n",
      " |      >>> from sympy import Interval\n",
      " |      \n",
      " |      >>> Interval(1, 3).intersect(Interval(1, 2))\n",
      " |      Interval(1, 2)\n",
      " |      \n",
      " |      >>> from sympy import imageset, Lambda, symbols, S\n",
      " |      >>> n, m = symbols('n m')\n",
      " |      >>> a = imageset(Lambda(n, 2*n), S.Integers)\n",
      " |      >>> a.intersect(imageset(Lambda(m, 2*m + 1), S.Integers))\n",
      " |      EmptySet\n",
      " |  \n",
      " |  is_disjoint(self, other)\n",
      " |      Returns True if ``self`` and ``other`` are disjoint.\n",
      " |      \n",
      " |      Examples\n",
      " |      ========\n",
      " |      \n",
      " |      >>> from sympy import Interval\n",
      " |      >>> Interval(0, 2).is_disjoint(Interval(1, 2))\n",
      " |      False\n",
      " |      >>> Interval(0, 2).is_disjoint(Interval(3, 4))\n",
      " |      True\n",
      " |      \n",
      " |      References\n",
      " |      ==========\n",
      " |      \n",
      " |      .. [1] https://en.wikipedia.org/wiki/Disjoint_sets\n",
      " |  \n",
      " |  is_proper_subset(self, other)\n",
      " |      Returns True if ``self`` is a proper subset of ``other``.\n",
      " |      \n",
      " |      Examples\n",
      " |      ========\n",
      " |      \n",
      " |      >>> from sympy import Interval\n",
      " |      >>> Interval(0, 0.5).is_proper_subset(Interval(0, 1))\n",
      " |      True\n",
      " |      >>> Interval(0, 1).is_proper_subset(Interval(0, 1))\n",
      " |      False\n",
      " |  \n",
      " |  is_proper_superset(self, other)\n",
      " |      Returns True if ``self`` is a proper superset of ``other``.\n",
      " |      \n",
      " |      Examples\n",
      " |      ========\n",
      " |      \n",
      " |      >>> from sympy import Interval\n",
      " |      >>> Interval(0, 1).is_proper_superset(Interval(0, 0.5))\n",
      " |      True\n",
      " |      >>> Interval(0, 1).is_proper_superset(Interval(0, 1))\n",
      " |      False\n",
      " |  \n",
      " |  is_subset(self, other)\n",
      " |      Returns True if ``self`` is a subset of ``other``.\n",
      " |      \n",
      " |      Examples\n",
      " |      ========\n",
      " |      \n",
      " |      >>> from sympy import Interval\n",
      " |      >>> Interval(0, 0.5).is_subset(Interval(0, 1))\n",
      " |      True\n",
      " |      >>> Interval(0, 1).is_subset(Interval(0, 1, left_open=True))\n",
      " |      False\n",
      " |  \n",
      " |  is_superset(self, other)\n",
      " |      Returns True if ``self`` is a superset of ``other``.\n",
      " |      \n",
      " |      Examples\n",
      " |      ========\n",
      " |      \n",
      " |      >>> from sympy import Interval\n",
      " |      >>> Interval(0, 0.5).is_superset(Interval(0, 1))\n",
      " |      False\n",
      " |      >>> Interval(0, 1).is_superset(Interval(0, 1, left_open=True))\n",
      " |      True\n",
      " |  \n",
      " |  isdisjoint(self, other)\n",
      " |      Alias for :meth:`is_disjoint()`\n",
      " |  \n",
      " |  issubset(self, other)\n",
      " |      Alias for :meth:`is_subset()`\n",
      " |  \n",
      " |  issuperset(self, other)\n",
      " |      Alias for :meth:`is_superset()`\n",
      " |  \n",
      " |  powerset(self)\n",
      " |      Find the Power set of ``self``.\n",
      " |      \n",
      " |      Examples\n",
      " |      ========\n",
      " |      \n",
      " |      >>> from sympy import EmptySet, FiniteSet, Interval\n",
      " |      \n",
      " |      A power set of an empty set:\n",
      " |      \n",
      " |      >>> A = EmptySet\n",
      " |      >>> A.powerset()\n",
      " |      {EmptySet}\n",
      " |      \n",
      " |      A power set of a finite set:\n",
      " |      \n",
      " |      >>> A = FiniteSet(1, 2)\n",
      " |      >>> a, b, c = FiniteSet(1), FiniteSet(2), FiniteSet(1, 2)\n",
      " |      >>> A.powerset() == FiniteSet(a, b, c, EmptySet)\n",
      " |      True\n",
      " |      \n",
      " |      A power set of an interval:\n",
      " |      \n",
      " |      >>> Interval(1, 2).powerset()\n",
      " |      PowerSet(Interval(1, 2))\n",
      " |      \n",
      " |      References\n",
      " |      ==========\n",
      " |      \n",
      " |      .. [1] https://en.wikipedia.org/wiki/Power_set\n",
      " |  \n",
      " |  symmetric_difference(self, other)\n",
      " |      Returns symmetric difference of ``self`` and ``other``.\n",
      " |      \n",
      " |      Examples\n",
      " |      ========\n",
      " |      \n",
      " |      >>> from sympy import Interval, S\n",
      " |      >>> Interval(1, 3).symmetric_difference(S.Reals)\n",
      " |      Union(Interval.open(-oo, 1), Interval.open(3, oo))\n",
      " |      >>> Interval(1, 10).symmetric_difference(S.Reals)\n",
      " |      Union(Interval.open(-oo, 1), Interval.open(10, oo))\n",
      " |      \n",
      " |      >>> from sympy import S, EmptySet\n",
      " |      >>> S.Reals.symmetric_difference(EmptySet)\n",
      " |      Reals\n",
      " |      \n",
      " |      References\n",
      " |      ==========\n",
      " |      .. [1] https://en.wikipedia.org/wiki/Symmetric_difference\n",
      " |  \n",
      " |  union(self, other)\n",
      " |      Returns the union of ``self`` and ``other``.\n",
      " |      \n",
      " |      Examples\n",
      " |      ========\n",
      " |      \n",
      " |      As a shortcut it is possible to use the ``+`` operator:\n",
      " |      \n",
      " |      >>> from sympy import Interval, FiniteSet\n",
      " |      >>> Interval(0, 1).union(Interval(2, 3))\n",
      " |      Union(Interval(0, 1), Interval(2, 3))\n",
      " |      >>> Interval(0, 1) + Interval(2, 3)\n",
      " |      Union(Interval(0, 1), Interval(2, 3))\n",
      " |      >>> Interval(1, 2, True, True) + FiniteSet(2, 3)\n",
      " |      Union({3}, Interval.Lopen(1, 2))\n",
      " |      \n",
      " |      Similarly it is possible to use the ``-`` operator for set differences:\n",
      " |      \n",
      " |      >>> Interval(0, 2) - Interval(0, 1)\n",
      " |      Interval.Lopen(1, 2)\n",
      " |      >>> Interval(1, 3) - FiniteSet(2)\n",
      " |      Union(Interval.Ropen(1, 2), Interval.Lopen(2, 3))\n",
      " |  \n",
      " |  ----------------------------------------------------------------------\n",
      " |  Readonly properties inherited from sympy.sets.sets.Set:\n",
      " |  \n",
      " |  boundary\n",
      " |      The boundary or frontier of a set.\n",
      " |      \n",
      " |      Explanation\n",
      " |      ===========\n",
      " |      \n",
      " |      A point x is on the boundary of a set S if\n",
      " |      \n",
      " |      1.  x is in the closure of S.\n",
      " |          I.e. Every neighborhood of x contains a point in S.\n",
      " |      2.  x is not in the interior of S.\n",
      " |          I.e. There does not exist an open set centered on x contained\n",
      " |          entirely within S.\n",
      " |      \n",
      " |      There are the points on the outer rim of S.  If S is open then these\n",
      " |      points need not actually be contained within S.\n",
      " |      \n",
      " |      For example, the boundary of an interval is its start and end points.\n",
      " |      This is true regardless of whether or not the interval is open.\n",
      " |      \n",
      " |      Examples\n",
      " |      ========\n",
      " |      \n",
      " |      >>> from sympy import Interval\n",
      " |      >>> Interval(0, 1).boundary\n",
      " |      {0, 1}\n",
      " |      >>> Interval(0, 1, True, False).boundary\n",
      " |      {0, 1}\n",
      " |  \n",
      " |  closure\n",
      " |      Property method which returns the closure of a set.\n",
      " |      The closure is defined as the union of the set itself and its\n",
      " |      boundary.\n",
      " |      \n",
      " |      Examples\n",
      " |      ========\n",
      " |      >>> from sympy import S, Interval\n",
      " |      >>> S.Reals.closure\n",
      " |      Reals\n",
      " |      >>> Interval(0, 1).closure\n",
      " |      Interval(0, 1)\n",
      " |  \n",
      " |  inf\n",
      " |      The infimum of ``self``.\n",
      " |      \n",
      " |      Examples\n",
      " |      ========\n",
      " |      \n",
      " |      >>> from sympy import Interval, Union\n",
      " |      >>> Interval(0, 1).inf\n",
      " |      0\n",
      " |      >>> Union(Interval(0, 1), Interval(2, 3)).inf\n",
      " |      0\n",
      " |  \n",
      " |  interior\n",
      " |      Property method which returns the interior of a set.\n",
      " |      The interior of a set S consists all points of S that do not\n",
      " |      belong to the boundary of S.\n",
      " |      \n",
      " |      Examples\n",
      " |      ========\n",
      " |      >>> from sympy import Interval\n",
      " |      >>> Interval(0, 1).interior\n",
      " |      Interval.open(0, 1)\n",
      " |      >>> Interval(0, 1).boundary.interior\n",
      " |      EmptySet\n",
      " |  \n",
      " |  is_EmptySet\n",
      " |  \n",
      " |  is_closed\n",
      " |      A property method to check whether a set is closed.\n",
      " |      \n",
      " |      Explanation\n",
      " |      ===========\n",
      " |      \n",
      " |      A set is closed if its complement is an open set. The closedness of a\n",
      " |      subset of the reals is determined with respect to R and its standard\n",
      " |      topology.\n",
      " |      \n",
      " |      Examples\n",
      " |      ========\n",
      " |      >>> from sympy import Interval\n",
      " |      >>> Interval(0, 1).is_closed\n",
      " |      True\n",
      " |  \n",
      " |  is_open\n",
      " |      Property method to check whether a set is open.\n",
      " |      \n",
      " |      Explanation\n",
      " |      ===========\n",
      " |      \n",
      " |      A set is open if and only if it has an empty intersection with its\n",
      " |      boundary. In particular, a subset A of the reals is open if and only\n",
      " |      if each one of its points is contained in an open interval that is a\n",
      " |      subset of A.\n",
      " |      \n",
      " |      Examples\n",
      " |      ========\n",
      " |      >>> from sympy import S\n",
      " |      >>> S.Reals.is_open\n",
      " |      True\n",
      " |      >>> S.Rationals.is_open\n",
      " |      False\n",
      " |  \n",
      " |  kind\n",
      " |      The kind of a Set\n",
      " |      \n",
      " |      Explanation\n",
      " |      ===========\n",
      " |      \n",
      " |      Any :class:`Set` will have kind :class:`SetKind` which is\n",
      " |      parametrised by the kind of the elements of the set. For example\n",
      " |      most sets are sets of numbers and will have kind\n",
      " |      ``SetKind(NumberKind)``. If elements of sets are different in kind than\n",
      " |      their kind will ``SetKind(UndefinedKind)``. See\n",
      " |      :class:`sympy.core.kind.Kind` for an explanation of the kind system.\n",
      " |      \n",
      " |      Examples\n",
      " |      ========\n",
      " |      \n",
      " |      >>> from sympy import Interval, Matrix, FiniteSet, EmptySet, ProductSet, PowerSet\n",
      " |      \n",
      " |      >>> FiniteSet(Matrix([1, 2])).kind\n",
      " |      SetKind(MatrixKind(NumberKind))\n",
      " |      \n",
      " |      >>> Interval(1, 2).kind\n",
      " |      SetKind(NumberKind)\n",
      " |      \n",
      " |      >>> EmptySet.kind\n",
      " |      SetKind()\n",
      " |      \n",
      " |      A :class:`sympy.sets.powerset.PowerSet` is a set of sets:\n",
      " |      \n",
      " |      >>> PowerSet({1, 2, 3}).kind\n",
      " |      SetKind(SetKind(NumberKind))\n",
      " |      \n",
      " |      A :class:`ProductSet` represents the set of tuples of elements of\n",
      " |      other sets. Its kind is :class:`sympy.core.containers.TupleKind`\n",
      " |      parametrised by the kinds of the elements of those sets:\n",
      " |      \n",
      " |      >>> p = ProductSet(FiniteSet(1, 2), FiniteSet(3, 4))\n",
      " |      >>> list(p)\n",
      " |      [(1, 3), (2, 3), (1, 4), (2, 4)]\n",
      " |      >>> p.kind\n",
      " |      SetKind(TupleKind(NumberKind, NumberKind))\n",
      " |      \n",
      " |      When all elements of the set do not have same kind, the kind\n",
      " |      will be returned as ``SetKind(UndefinedKind)``:\n",
      " |      \n",
      " |      >>> FiniteSet(0, Matrix([1, 2])).kind\n",
      " |      SetKind(UndefinedKind)\n",
      " |      \n",
      " |      The kind of the elements of a set are given by the ``element_kind``\n",
      " |      attribute of ``SetKind``:\n",
      " |      \n",
      " |      >>> Interval(1, 2).kind.element_kind\n",
      " |      NumberKind\n",
      " |      \n",
      " |      See Also\n",
      " |      ========\n",
      " |      \n",
      " |      NumberKind\n",
      " |      sympy.core.kind.UndefinedKind\n",
      " |      sympy.core.containers.TupleKind\n",
      " |      MatrixKind\n",
      " |      sympy.matrices.expressions.sets.MatrixSet\n",
      " |      sympy.sets.conditionset.ConditionSet\n",
      " |      Rationals\n",
      " |      Naturals\n",
      " |      Integers\n",
      " |      sympy.sets.fancysets.ImageSet\n",
      " |      sympy.sets.fancysets.Range\n",
      " |      sympy.sets.fancysets.ComplexRegion\n",
      " |      sympy.sets.powerset.PowerSet\n",
      " |      sympy.sets.sets.ProductSet\n",
      " |      sympy.sets.sets.Interval\n",
      " |      sympy.sets.sets.Union\n",
      " |      sympy.sets.sets.Intersection\n",
      " |      sympy.sets.sets.Complement\n",
      " |      sympy.sets.sets.EmptySet\n",
      " |      sympy.sets.sets.UniversalSet\n",
      " |      sympy.sets.sets.FiniteSet\n",
      " |      sympy.sets.sets.SymmetricDifference\n",
      " |      sympy.sets.sets.DisjointUnion\n",
      " |  \n",
      " |  measure\n",
      " |      The (Lebesgue) measure of ``self``.\n",
      " |      \n",
      " |      Examples\n",
      " |      ========\n",
      " |      \n",
      " |      >>> from sympy import Interval, Union\n",
      " |      >>> Interval(0, 1).measure\n",
      " |      1\n",
      " |      >>> Union(Interval(0, 1), Interval(2, 3)).measure\n",
      " |      2\n",
      " |  \n",
      " |  sup\n",
      " |      The supremum of ``self``.\n",
      " |      \n",
      " |      Examples\n",
      " |      ========\n",
      " |      \n",
      " |      >>> from sympy import Interval, Union\n",
      " |      >>> Interval(0, 1).sup\n",
      " |      1\n",
      " |      >>> Union(Interval(0, 1), Interval(2, 3)).sup\n",
      " |      3\n",
      " |  \n",
      " |  ----------------------------------------------------------------------\n",
      " |  Data and other attributes inherited from sympy.sets.sets.Set:\n",
      " |  \n",
      " |  is_Complement = None\n",
      " |  \n",
      " |  is_ComplexRegion = False\n",
      " |  \n",
      " |  is_FiniteSet = False\n",
      " |  \n",
      " |  is_Intersection = None\n",
      " |  \n",
      " |  is_Interval = False\n",
      " |  \n",
      " |  is_ProductSet = False\n",
      " |  \n",
      " |  is_Union = False\n",
      " |  \n",
      " |  is_UniversalSet = None\n",
      " |  \n",
      " |  is_empty = None\n",
      " |  \n",
      " |  is_finite_set = None\n",
      " |  \n",
      " |  is_interval = False\n",
      " |  \n",
      " |  is_iterable = False\n",
      " |  \n",
      " |  is_number = False\n",
      " |  \n",
      " |  ----------------------------------------------------------------------\n",
      " |  Methods inherited from sympy.core.basic.Basic:\n",
      " |  \n",
      " |  __eq__(self, other)\n",
      " |      Return a boolean indicating whether a == b on the basis of\n",
      " |      their symbolic trees.\n",
      " |      \n",
      " |      This is the same as a.compare(b) == 0 but faster.\n",
      " |      \n",
      " |      Notes\n",
      " |      =====\n",
      " |      \n",
      " |      If a class that overrides __eq__() needs to retain the\n",
      " |      implementation of __hash__() from a parent class, the\n",
      " |      interpreter must be told this explicitly by setting\n",
      " |      __hash__ : Callable[[object], int] = <ParentClass>.__hash__.\n",
      " |      Otherwise the inheritance of __hash__() will be blocked,\n",
      " |      just as if __hash__ had been explicitly set to None.\n",
      " |      \n",
      " |      References\n",
      " |      ==========\n",
      " |      \n",
      " |      from http://docs.python.org/dev/reference/datamodel.html#object.__hash__\n",
      " |  \n",
      " |  __getstate__(self)\n",
      " |  \n",
      " |  __hash__(self) -> 'int'\n",
      " |      Return hash(self).\n",
      " |  \n",
      " |  __reduce_ex__(self, protocol)\n",
      " |      Helper for pickle.\n",
      " |  \n",
      " |  __setstate__(self, state)\n",
      " |  \n",
      " |  as_content_primitive(self, radical=False, clear=True)\n",
      " |      A stub to allow Basic args (like Tuple) to be skipped when computing\n",
      " |      the content and primitive components of an expression.\n",
      " |      \n",
      " |      See Also\n",
      " |      ========\n",
      " |      \n",
      " |      sympy.core.expr.Expr.as_content_primitive\n",
      " |  \n",
      " |  as_dummy(self)\n",
      " |      Return the expression with any objects having structurally\n",
      " |      bound symbols replaced with unique, canonical symbols within\n",
      " |      the object in which they appear and having only the default\n",
      " |      assumption for commutativity being True. When applied to a\n",
      " |      symbol a new symbol having only the same commutativity will be\n",
      " |      returned.\n",
      " |      \n",
      " |      Examples\n",
      " |      ========\n",
      " |      \n",
      " |      >>> from sympy import Integral, Symbol\n",
      " |      >>> from sympy.abc import x\n",
      " |      >>> r = Symbol('r', real=True)\n",
      " |      >>> Integral(r, (r, x)).as_dummy()\n",
      " |      Integral(_0, (_0, x))\n",
      " |      >>> _.variables[0].is_real is None\n",
      " |      True\n",
      " |      >>> r.as_dummy()\n",
      " |      _r\n",
      " |      \n",
      " |      Notes\n",
      " |      =====\n",
      " |      \n",
      " |      Any object that has structurally bound variables should have\n",
      " |      a property, `bound_symbols` that returns those symbols\n",
      " |      appearing in the object.\n",
      " |  \n",
      " |  atoms(self, *types)\n",
      " |      Returns the atoms that form the current object.\n",
      " |      \n",
      " |      By default, only objects that are truly atomic and cannot\n",
      " |      be divided into smaller pieces are returned: symbols, numbers,\n",
      " |      and number symbols like I and pi. It is possible to request\n",
      " |      atoms of any type, however, as demonstrated below.\n",
      " |      \n",
      " |      Examples\n",
      " |      ========\n",
      " |      \n",
      " |      >>> from sympy import I, pi, sin\n",
      " |      >>> from sympy.abc import x, y\n",
      " |      >>> (1 + x + 2*sin(y + I*pi)).atoms()\n",
      " |      {1, 2, I, pi, x, y}\n",
      " |      \n",
      " |      If one or more types are given, the results will contain only\n",
      " |      those types of atoms.\n",
      " |      \n",
      " |      >>> from sympy import Number, NumberSymbol, Symbol\n",
      " |      >>> (1 + x + 2*sin(y + I*pi)).atoms(Symbol)\n",
      " |      {x, y}\n",
      " |      \n",
      " |      >>> (1 + x + 2*sin(y + I*pi)).atoms(Number)\n",
      " |      {1, 2}\n",
      " |      \n",
      " |      >>> (1 + x + 2*sin(y + I*pi)).atoms(Number, NumberSymbol)\n",
      " |      {1, 2, pi}\n",
      " |      \n",
      " |      >>> (1 + x + 2*sin(y + I*pi)).atoms(Number, NumberSymbol, I)\n",
      " |      {1, 2, I, pi}\n",
      " |      \n",
      " |      Note that I (imaginary unit) and zoo (complex infinity) are special\n",
      " |      types of number symbols and are not part of the NumberSymbol class.\n",
      " |      \n",
      " |      The type can be given implicitly, too:\n",
      " |      \n",
      " |      >>> (1 + x + 2*sin(y + I*pi)).atoms(x) # x is a Symbol\n",
      " |      {x, y}\n",
      " |      \n",
      " |      Be careful to check your assumptions when using the implicit option\n",
      " |      since ``S(1).is_Integer = True`` but ``type(S(1))`` is ``One``, a special type\n",
      " |      of SymPy atom, while ``type(S(2))`` is type ``Integer`` and will find all\n",
      " |      integers in an expression:\n",
      " |      \n",
      " |      >>> from sympy import S\n",
      " |      >>> (1 + x + 2*sin(y + I*pi)).atoms(S(1))\n",
      " |      {1}\n",
      " |      \n",
      " |      >>> (1 + x + 2*sin(y + I*pi)).atoms(S(2))\n",
      " |      {1, 2}\n",
      " |      \n",
      " |      Finally, arguments to atoms() can select more than atomic atoms: any\n",
      " |      SymPy type (loaded in core/__init__.py) can be listed as an argument\n",
      " |      and those types of \"atoms\" as found in scanning the arguments of the\n",
      " |      expression recursively:\n",
      " |      \n",
      " |      >>> from sympy import Function, Mul\n",
      " |      >>> from sympy.core.function import AppliedUndef\n",
      " |      >>> f = Function('f')\n",
      " |      >>> (1 + f(x) + 2*sin(y + I*pi)).atoms(Function)\n",
      " |      {f(x), sin(y + I*pi)}\n",
      " |      >>> (1 + f(x) + 2*sin(y + I*pi)).atoms(AppliedUndef)\n",
      " |      {f(x)}\n",
      " |      \n",
      " |      >>> (1 + x + 2*sin(y + I*pi)).atoms(Mul)\n",
      " |      {I*pi, 2*sin(y + I*pi)}\n",
      " |  \n",
      " |  compare(self, other)\n",
      " |      Return -1, 0, 1 if the object is smaller, equal, or greater than other.\n",
      " |      \n",
      " |      Not in the mathematical sense. If the object is of a different type\n",
      " |      from the \"other\" then their classes are ordered according to\n",
      " |      the sorted_classes list.\n",
      " |      \n",
      " |      Examples\n",
      " |      ========\n",
      " |      \n",
      " |      >>> from sympy.abc import x, y\n",
      " |      >>> x.compare(y)\n",
      " |      -1\n",
      " |      >>> x.compare(x)\n",
      " |      0\n",
      " |      >>> y.compare(x)\n",
      " |      1\n",
      " |  \n",
      " |  copy(self)\n",
      " |  \n",
      " |  could_extract_minus_sign(self)\n",
      " |  \n",
      " |  count(self, query)\n",
      " |      Count the number of matching subexpressions.\n",
      " |  \n",
      " |  count_ops(self, visual=None)\n",
      " |      wrapper for count_ops that returns the operation count.\n",
      " |  \n",
      " |  doit(self, **hints)\n",
      " |      Evaluate objects that are not evaluated by default like limits,\n",
      " |      integrals, sums and products. All objects of this kind will be\n",
      " |      evaluated recursively, unless some species were excluded via 'hints'\n",
      " |      or unless the 'deep' hint was set to 'False'.\n",
      " |      \n",
      " |      >>> from sympy import Integral\n",
      " |      >>> from sympy.abc import x\n",
      " |      \n",
      " |      >>> 2*Integral(x, x)\n",
      " |      2*Integral(x, x)\n",
      " |      \n",
      " |      >>> (2*Integral(x, x)).doit()\n",
      " |      x**2\n",
      " |      \n",
      " |      >>> (2*Integral(x, x)).doit(deep=False)\n",
      " |      2*Integral(x, x)\n",
      " |  \n",
      " |  dummy_eq(self, other, symbol=None)\n",
      " |      Compare two expressions and handle dummy symbols.\n",
      " |      \n",
      " |      Examples\n",
      " |      ========\n",
      " |      \n",
      " |      >>> from sympy import Dummy\n",
      " |      >>> from sympy.abc import x, y\n",
      " |      \n",
      " |      >>> u = Dummy('u')\n",
      " |      \n",
      " |      >>> (u**2 + 1).dummy_eq(x**2 + 1)\n",
      " |      True\n",
      " |      >>> (u**2 + 1) == (x**2 + 1)\n",
      " |      False\n",
      " |      \n",
      " |      >>> (u**2 + y).dummy_eq(x**2 + y, x)\n",
      " |      True\n",
      " |      >>> (u**2 + y).dummy_eq(x**2 + y, y)\n",
      " |      False\n",
      " |  \n",
      " |  find(self, query, group=False)\n",
      " |      Find all subexpressions matching a query.\n",
      " |  \n",
      " |  has(self, *patterns)\n",
      " |      Test whether any subexpression matches any of the patterns.\n",
      " |      \n",
      " |      Examples\n",
      " |      ========\n",
      " |      \n",
      " |      >>> from sympy import sin\n",
      " |      >>> from sympy.abc import x, y, z\n",
      " |      >>> (x**2 + sin(x*y)).has(z)\n",
      " |      False\n",
      " |      >>> (x**2 + sin(x*y)).has(x, y, z)\n",
      " |      True\n",
      " |      >>> x.has(x)\n",
      " |      True\n",
      " |      \n",
      " |      Note ``has`` is a structural algorithm with no knowledge of\n",
      " |      mathematics. Consider the following half-open interval:\n",
      " |      \n",
      " |      >>> from sympy import Interval\n",
      " |      >>> i = Interval.Lopen(0, 5); i\n",
      " |      Interval.Lopen(0, 5)\n",
      " |      >>> i.args\n",
      " |      (0, 5, True, False)\n",
      " |      >>> i.has(4)  # there is no \"4\" in the arguments\n",
      " |      False\n",
      " |      >>> i.has(0)  # there *is* a \"0\" in the arguments\n",
      " |      True\n",
      " |      \n",
      " |      Instead, use ``contains`` to determine whether a number is in the\n",
      " |      interval or not:\n",
      " |      \n",
      " |      >>> i.contains(4)\n",
      " |      True\n",
      " |      >>> i.contains(0)\n",
      " |      False\n",
      " |      \n",
      " |      \n",
      " |      Note that ``expr.has(*patterns)`` is exactly equivalent to\n",
      " |      ``any(expr.has(p) for p in patterns)``. In particular, ``False`` is\n",
      " |      returned when the list of patterns is empty.\n",
      " |      \n",
      " |      >>> x.has()\n",
      " |      False\n",
      " |  \n",
      " |  has_free(self, *patterns)\n",
      " |      return True if self has object(s) ``x`` as a free expression\n",
      " |      else False.\n",
      " |      \n",
      " |      Examples\n",
      " |      ========\n",
      " |      \n",
      " |      >>> from sympy import Integral, Function\n",
      " |      >>> from sympy.abc import x, y\n",
      " |      >>> f = Function('f')\n",
      " |      >>> g = Function('g')\n",
      " |      >>> expr = Integral(f(x), (f(x), 1, g(y)))\n",
      " |      >>> expr.free_symbols\n",
      " |      {y}\n",
      " |      >>> expr.has_free(g(y))\n",
      " |      True\n",
      " |      >>> expr.has_free(*(x, f(x)))\n",
      " |      False\n",
      " |      \n",
      " |      This works for subexpressions and types, too:\n",
      " |      \n",
      " |      >>> expr.has_free(g)\n",
      " |      True\n",
      " |      >>> (x + y + 1).has_free(y + 1)\n",
      " |      True\n",
      " |  \n",
      " |  is_hypergeometric(self, k)\n",
      " |  \n",
      " |  match(self, pattern, old=False)\n",
      " |      Pattern matching.\n",
      " |      \n",
      " |      Wild symbols match all.\n",
      " |      \n",
      " |      Return ``None`` when expression (self) does not match\n",
      " |      with pattern. Otherwise return a dictionary such that::\n",
      " |      \n",
      " |        pattern.xreplace(self.match(pattern)) == self\n",
      " |      \n",
      " |      Examples\n",
      " |      ========\n",
      " |      \n",
      " |      >>> from sympy import Wild, Sum\n",
      " |      >>> from sympy.abc import x, y\n",
      " |      >>> p = Wild(\"p\")\n",
      " |      >>> q = Wild(\"q\")\n",
      " |      >>> r = Wild(\"r\")\n",
      " |      >>> e = (x+y)**(x+y)\n",
      " |      >>> e.match(p**p)\n",
      " |      {p_: x + y}\n",
      " |      >>> e.match(p**q)\n",
      " |      {p_: x + y, q_: x + y}\n",
      " |      >>> e = (2*x)**2\n",
      " |      >>> e.match(p*q**r)\n",
      " |      {p_: 4, q_: x, r_: 2}\n",
      " |      >>> (p*q**r).xreplace(e.match(p*q**r))\n",
      " |      4*x**2\n",
      " |      \n",
      " |      Structurally bound symbols are ignored during matching:\n",
      " |      \n",
      " |      >>> Sum(x, (x, 1, 2)).match(Sum(y, (y, 1, p)))\n",
      " |      {p_: 2}\n",
      " |      \n",
      " |      But they can be identified if desired:\n",
      " |      \n",
      " |      >>> Sum(x, (x, 1, 2)).match(Sum(q, (q, 1, p)))\n",
      " |      {p_: 2, q_: x}\n",
      " |      \n",
      " |      The ``old`` flag will give the old-style pattern matching where\n",
      " |      expressions and patterns are essentially solved to give the\n",
      " |      match. Both of the following give None unless ``old=True``:\n",
      " |      \n",
      " |      >>> (x - 2).match(p - x, old=True)\n",
      " |      {p_: 2*x - 2}\n",
      " |      >>> (2/x).match(p*x, old=True)\n",
      " |      {p_: 2/x**2}\n",
      " |  \n",
      " |  matches(self, expr, repl_dict=None, old=False)\n",
      " |      Helper method for match() that looks for a match between Wild symbols\n",
      " |      in self and expressions in expr.\n",
      " |      \n",
      " |      Examples\n",
      " |      ========\n",
      " |      \n",
      " |      >>> from sympy import symbols, Wild, Basic\n",
      " |      >>> a, b, c = symbols('a b c')\n",
      " |      >>> x = Wild('x')\n",
      " |      >>> Basic(a + x, x).matches(Basic(a + b, c)) is None\n",
      " |      True\n",
      " |      >>> Basic(a + x, x).matches(Basic(a + b + c, b + c))\n",
      " |      {x_: b + c}\n",
      " |  \n",
      " |  rcall(self, *args)\n",
      " |      Apply on the argument recursively through the expression tree.\n",
      " |      \n",
      " |      This method is used to simulate a common abuse of notation for\n",
      " |      operators. For instance, in SymPy the following will not work:\n",
      " |      \n",
      " |      ``(x+Lambda(y, 2*y))(z) == x+2*z``,\n",
      " |      \n",
      " |      however, you can use:\n",
      " |      \n",
      " |      >>> from sympy import Lambda\n",
      " |      >>> from sympy.abc import x, y, z\n",
      " |      >>> (x + Lambda(y, 2*y)).rcall(z)\n",
      " |      x + 2*z\n",
      " |  \n",
      " |  refine(self, assumption=True)\n",
      " |      See the refine function in sympy.assumptions\n",
      " |  \n",
      " |  replace(self, query, value, map=False, simultaneous=True, exact=None)\n",
      " |      Replace matching subexpressions of ``self`` with ``value``.\n",
      " |      \n",
      " |      If ``map = True`` then also return the mapping {old: new} where ``old``\n",
      " |      was a sub-expression found with query and ``new`` is the replacement\n",
      " |      value for it. If the expression itself does not match the query, then\n",
      " |      the returned value will be ``self.xreplace(map)`` otherwise it should\n",
      " |      be ``self.subs(ordered(map.items()))``.\n",
      " |      \n",
      " |      Traverses an expression tree and performs replacement of matching\n",
      " |      subexpressions from the bottom to the top of the tree. The default\n",
      " |      approach is to do the replacement in a simultaneous fashion so\n",
      " |      changes made are targeted only once. If this is not desired or causes\n",
      " |      problems, ``simultaneous`` can be set to False.\n",
      " |      \n",
      " |      In addition, if an expression containing more than one Wild symbol\n",
      " |      is being used to match subexpressions and the ``exact`` flag is None\n",
      " |      it will be set to True so the match will only succeed if all non-zero\n",
      " |      values are received for each Wild that appears in the match pattern.\n",
      " |      Setting this to False accepts a match of 0; while setting it True\n",
      " |      accepts all matches that have a 0 in them. See example below for\n",
      " |      cautions.\n",
      " |      \n",
      " |      The list of possible combinations of queries and replacement values\n",
      " |      is listed below:\n",
      " |      \n",
      " |      Examples\n",
      " |      ========\n",
      " |      \n",
      " |      Initial setup\n",
      " |      \n",
      " |      >>> from sympy import log, sin, cos, tan, Wild, Mul, Add\n",
      " |      >>> from sympy.abc import x, y\n",
      " |      >>> f = log(sin(x)) + tan(sin(x**2))\n",
      " |      \n",
      " |      1.1. type -> type\n",
      " |          obj.replace(type, newtype)\n",
      " |      \n",
      " |          When object of type ``type`` is found, replace it with the\n",
      " |          result of passing its argument(s) to ``newtype``.\n",
      " |      \n",
      " |          >>> f.replace(sin, cos)\n",
      " |          log(cos(x)) + tan(cos(x**2))\n",
      " |          >>> sin(x).replace(sin, cos, map=True)\n",
      " |          (cos(x), {sin(x): cos(x)})\n",
      " |          >>> (x*y).replace(Mul, Add)\n",
      " |          x + y\n",
      " |      \n",
      " |      1.2. type -> func\n",
      " |          obj.replace(type, func)\n",
      " |      \n",
      " |          When object of type ``type`` is found, apply ``func`` to its\n",
      " |          argument(s). ``func`` must be written to handle the number\n",
      " |          of arguments of ``type``.\n",
      " |      \n",
      " |          >>> f.replace(sin, lambda arg: sin(2*arg))\n",
      " |          log(sin(2*x)) + tan(sin(2*x**2))\n",
      " |          >>> (x*y).replace(Mul, lambda *args: sin(2*Mul(*args)))\n",
      " |          sin(2*x*y)\n",
      " |      \n",
      " |      2.1. pattern -> expr\n",
      " |          obj.replace(pattern(wild), expr(wild))\n",
      " |      \n",
      " |          Replace subexpressions matching ``pattern`` with the expression\n",
      " |          written in terms of the Wild symbols in ``pattern``.\n",
      " |      \n",
      " |          >>> a, b = map(Wild, 'ab')\n",
      " |          >>> f.replace(sin(a), tan(a))\n",
      " |          log(tan(x)) + tan(tan(x**2))\n",
      " |          >>> f.replace(sin(a), tan(a/2))\n",
      " |          log(tan(x/2)) + tan(tan(x**2/2))\n",
      " |          >>> f.replace(sin(a), a)\n",
      " |          log(x) + tan(x**2)\n",
      " |          >>> (x*y).replace(a*x, a)\n",
      " |          y\n",
      " |      \n",
      " |          Matching is exact by default when more than one Wild symbol\n",
      " |          is used: matching fails unless the match gives non-zero\n",
      " |          values for all Wild symbols:\n",
      " |      \n",
      " |          >>> (2*x + y).replace(a*x + b, b - a)\n",
      " |          y - 2\n",
      " |          >>> (2*x).replace(a*x + b, b - a)\n",
      " |          2*x\n",
      " |      \n",
      " |          When set to False, the results may be non-intuitive:\n",
      " |      \n",
      " |          >>> (2*x).replace(a*x + b, b - a, exact=False)\n",
      " |          2/x\n",
      " |      \n",
      " |      2.2. pattern -> func\n",
      " |          obj.replace(pattern(wild), lambda wild: expr(wild))\n",
      " |      \n",
      " |          All behavior is the same as in 2.1 but now a function in terms of\n",
      " |          pattern variables is used rather than an expression:\n",
      " |      \n",
      " |          >>> f.replace(sin(a), lambda a: sin(2*a))\n",
      " |          log(sin(2*x)) + tan(sin(2*x**2))\n",
      " |      \n",
      " |      3.1. func -> func\n",
      " |          obj.replace(filter, func)\n",
      " |      \n",
      " |          Replace subexpression ``e`` with ``func(e)`` if ``filter(e)``\n",
      " |          is True.\n",
      " |      \n",
      " |          >>> g = 2*sin(x**3)\n",
      " |          >>> g.replace(lambda expr: expr.is_Number, lambda expr: expr**2)\n",
      " |          4*sin(x**9)\n",
      " |      \n",
      " |      The expression itself is also targeted by the query but is done in\n",
      " |      such a fashion that changes are not made twice.\n",
      " |      \n",
      " |          >>> e = x*(x*y + 1)\n",
      " |          >>> e.replace(lambda x: x.is_Mul, lambda x: 2*x)\n",
      " |          2*x*(2*x*y + 1)\n",
      " |      \n",
      " |      When matching a single symbol, `exact` will default to True, but\n",
      " |      this may or may not be the behavior that is desired:\n",
      " |      \n",
      " |      Here, we want `exact=False`:\n",
      " |      \n",
      " |      >>> from sympy import Function\n",
      " |      >>> f = Function('f')\n",
      " |      >>> e = f(1) + f(0)\n",
      " |      >>> q = f(a), lambda a: f(a + 1)\n",
      " |      >>> e.replace(*q, exact=False)\n",
      " |      f(1) + f(2)\n",
      " |      >>> e.replace(*q, exact=True)\n",
      " |      f(0) + f(2)\n",
      " |      \n",
      " |      But here, the nature of matching makes selecting\n",
      " |      the right setting tricky:\n",
      " |      \n",
      " |      >>> e = x**(1 + y)\n",
      " |      >>> (x**(1 + y)).replace(x**(1 + a), lambda a: x**-a, exact=False)\n",
      " |      x\n",
      " |      >>> (x**(1 + y)).replace(x**(1 + a), lambda a: x**-a, exact=True)\n",
      " |      x**(-x - y + 1)\n",
      " |      >>> (x**y).replace(x**(1 + a), lambda a: x**-a, exact=False)\n",
      " |      x\n",
      " |      >>> (x**y).replace(x**(1 + a), lambda a: x**-a, exact=True)\n",
      " |      x**(1 - y)\n",
      " |      \n",
      " |      It is probably better to use a different form of the query\n",
      " |      that describes the target expression more precisely:\n",
      " |      \n",
      " |      >>> (1 + x**(1 + y)).replace(\n",
      " |      ... lambda x: x.is_Pow and x.exp.is_Add and x.exp.args[0] == 1,\n",
      " |      ... lambda x: x.base**(1 - (x.exp - 1)))\n",
      " |      ...\n",
      " |      x**(1 - y) + 1\n",
      " |      \n",
      " |      See Also\n",
      " |      ========\n",
      " |      \n",
      " |      subs: substitution of subexpressions as defined by the objects\n",
      " |            themselves.\n",
      " |      xreplace: exact node replacement in expr tree; also capable of\n",
      " |                using matching rules\n",
      " |  \n",
      " |  rewrite(self, *args, deep=True, **hints)\n",
      " |      Rewrite *self* using a defined rule.\n",
      " |      \n",
      " |      Rewriting transforms an expression to another, which is mathematically\n",
      " |      equivalent but structurally different. For example you can rewrite\n",
      " |      trigonometric functions as complex exponentials or combinatorial\n",
      " |      functions as gamma function.\n",
      " |      \n",
      " |      This method takes a *pattern* and a *rule* as positional arguments.\n",
      " |      *pattern* is optional parameter which defines the types of expressions\n",
      " |      that will be transformed. If it is not passed, all possible expressions\n",
      " |      will be rewritten. *rule* defines how the expression will be rewritten.\n",
      " |      \n",
      " |      Parameters\n",
      " |      ==========\n",
      " |      \n",
      " |      args : *rule*, or *pattern* and *rule*.\n",
      " |          - *pattern* is a type or an iterable of types.\n",
      " |          - *rule* can be any object.\n",
      " |      \n",
      " |      deep : bool, optional.\n",
      " |          If ``True``, subexpressions are recursively transformed. Default is\n",
      " |          ``True``.\n",
      " |      \n",
      " |      Examples\n",
      " |      ========\n",
      " |      \n",
      " |      If *pattern* is unspecified, all possible expressions are transformed.\n",
      " |      \n",
      " |      >>> from sympy import cos, sin, exp, I\n",
      " |      >>> from sympy.abc import x\n",
      " |      >>> expr = cos(x) + I*sin(x)\n",
      " |      >>> expr.rewrite(exp)\n",
      " |      exp(I*x)\n",
      " |      \n",
      " |      Pattern can be a type or an iterable of types.\n",
      " |      \n",
      " |      >>> expr.rewrite(sin, exp)\n",
      " |      exp(I*x)/2 + cos(x) - exp(-I*x)/2\n",
      " |      >>> expr.rewrite([cos,], exp)\n",
      " |      exp(I*x)/2 + I*sin(x) + exp(-I*x)/2\n",
      " |      >>> expr.rewrite([cos, sin], exp)\n",
      " |      exp(I*x)\n",
      " |      \n",
      " |      Rewriting behavior can be implemented by defining ``_eval_rewrite()``\n",
      " |      method.\n",
      " |      \n",
      " |      >>> from sympy import Expr, sqrt, pi\n",
      " |      >>> class MySin(Expr):\n",
      " |      ...     def _eval_rewrite(self, rule, args, **hints):\n",
      " |      ...         x, = args\n",
      " |      ...         if rule == cos:\n",
      " |      ...             return cos(pi/2 - x, evaluate=False)\n",
      " |      ...         if rule == sqrt:\n",
      " |      ...             return sqrt(1 - cos(x)**2)\n",
      " |      >>> MySin(MySin(x)).rewrite(cos)\n",
      " |      cos(-cos(-x + pi/2) + pi/2)\n",
      " |      >>> MySin(x).rewrite(sqrt)\n",
      " |      sqrt(1 - cos(x)**2)\n",
      " |      \n",
      " |      Defining ``_eval_rewrite_as_[...]()`` method is supported for backwards\n",
      " |      compatibility reason. This may be removed in the future and using it is\n",
      " |      discouraged.\n",
      " |      \n",
      " |      >>> class MySin(Expr):\n",
      " |      ...     def _eval_rewrite_as_cos(self, *args, **hints):\n",
      " |      ...         x, = args\n",
      " |      ...         return cos(pi/2 - x, evaluate=False)\n",
      " |      >>> MySin(x).rewrite(cos)\n",
      " |      cos(-x + pi/2)\n",
      " |  \n",
      " |  simplify(self, **kwargs)\n",
      " |      See the simplify function in sympy.simplify\n",
      " |  \n",
      " |  sort_key(self, order=None)\n",
      " |      Return a sort key.\n",
      " |      \n",
      " |      Examples\n",
      " |      ========\n",
      " |      \n",
      " |      >>> from sympy import S, I\n",
      " |      \n",
      " |      >>> sorted([S(1)/2, I, -I], key=lambda x: x.sort_key())\n",
      " |      [1/2, -I, I]\n",
      " |      \n",
      " |      >>> S(\"[x, 1/x, 1/x**2, x**2, x**(1/2), x**(1/4), x**(3/2)]\")\n",
      " |      [x, 1/x, x**(-2), x**2, sqrt(x), x**(1/4), x**(3/2)]\n",
      " |      >>> sorted(_, key=lambda x: x.sort_key())\n",
      " |      [x**(-2), 1/x, x**(1/4), sqrt(x), x, x**(3/2), x**2]\n",
      " |  \n",
      " |  subs(self, *args, **kwargs)\n",
      " |      Substitutes old for new in an expression after sympifying args.\n",
      " |      \n",
      " |      `args` is either:\n",
      " |        - two arguments, e.g. foo.subs(old, new)\n",
      " |        - one iterable argument, e.g. foo.subs(iterable). The iterable may be\n",
      " |           o an iterable container with (old, new) pairs. In this case the\n",
      " |             replacements are processed in the order given with successive\n",
      " |             patterns possibly affecting replacements already made.\n",
      " |           o a dict or set whose key/value items correspond to old/new pairs.\n",
      " |             In this case the old/new pairs will be sorted by op count and in\n",
      " |             case of a tie, by number of args and the default_sort_key. The\n",
      " |             resulting sorted list is then processed as an iterable container\n",
      " |             (see previous).\n",
      " |      \n",
      " |      If the keyword ``simultaneous`` is True, the subexpressions will not be\n",
      " |      evaluated until all the substitutions have been made.\n",
      " |      \n",
      " |      Examples\n",
      " |      ========\n",
      " |      \n",
      " |      >>> from sympy import pi, exp, limit, oo\n",
      " |      >>> from sympy.abc import x, y\n",
      " |      >>> (1 + x*y).subs(x, pi)\n",
      " |      pi*y + 1\n",
      " |      >>> (1 + x*y).subs({x:pi, y:2})\n",
      " |      1 + 2*pi\n",
      " |      >>> (1 + x*y).subs([(x, pi), (y, 2)])\n",
      " |      1 + 2*pi\n",
      " |      >>> reps = [(y, x**2), (x, 2)]\n",
      " |      >>> (x + y).subs(reps)\n",
      " |      6\n",
      " |      >>> (x + y).subs(reversed(reps))\n",
      " |      x**2 + 2\n",
      " |      \n",
      " |      >>> (x**2 + x**4).subs(x**2, y)\n",
      " |      y**2 + y\n",
      " |      \n",
      " |      To replace only the x**2 but not the x**4, use xreplace:\n",
      " |      \n",
      " |      >>> (x**2 + x**4).xreplace({x**2: y})\n",
      " |      x**4 + y\n",
      " |      \n",
      " |      To delay evaluation until all substitutions have been made,\n",
      " |      set the keyword ``simultaneous`` to True:\n",
      " |      \n",
      " |      >>> (x/y).subs([(x, 0), (y, 0)])\n",
      " |      0\n",
      " |      >>> (x/y).subs([(x, 0), (y, 0)], simultaneous=True)\n",
      " |      nan\n",
      " |      \n",
      " |      This has the added feature of not allowing subsequent substitutions\n",
      " |      to affect those already made:\n",
      " |      \n",
      " |      >>> ((x + y)/y).subs({x + y: y, y: x + y})\n",
      " |      1\n",
      " |      >>> ((x + y)/y).subs({x + y: y, y: x + y}, simultaneous=True)\n",
      " |      y/(x + y)\n",
      " |      \n",
      " |      In order to obtain a canonical result, unordered iterables are\n",
      " |      sorted by count_op length, number of arguments and by the\n",
      " |      default_sort_key to break any ties. All other iterables are left\n",
      " |      unsorted.\n",
      " |      \n",
      " |      >>> from sympy import sqrt, sin, cos\n",
      " |      >>> from sympy.abc import a, b, c, d, e\n",
      " |      \n",
      " |      >>> A = (sqrt(sin(2*x)), a)\n",
      " |      >>> B = (sin(2*x), b)\n",
      " |      >>> C = (cos(2*x), c)\n",
      " |      >>> D = (x, d)\n",
      " |      >>> E = (exp(x), e)\n",
      " |      \n",
      " |      >>> expr = sqrt(sin(2*x))*sin(exp(x)*x)*cos(2*x) + sin(2*x)\n",
      " |      \n",
      " |      >>> expr.subs(dict([A, B, C, D, E]))\n",
      " |      a*c*sin(d*e) + b\n",
      " |      \n",
      " |      The resulting expression represents a literal replacement of the\n",
      " |      old arguments with the new arguments. This may not reflect the\n",
      " |      limiting behavior of the expression:\n",
      " |      \n",
      " |      >>> (x**3 - 3*x).subs({x: oo})\n",
      " |      nan\n",
      " |      \n",
      " |      >>> limit(x**3 - 3*x, x, oo)\n",
      " |      oo\n",
      " |      \n",
      " |      If the substitution will be followed by numerical\n",
      " |      evaluation, it is better to pass the substitution to\n",
      " |      evalf as\n",
      " |      \n",
      " |      >>> (1/x).evalf(subs={x: 3.0}, n=21)\n",
      " |      0.333333333333333333333\n",
      " |      \n",
      " |      rather than\n",
      " |      \n",
      " |      >>> (1/x).subs({x: 3.0}).evalf(21)\n",
      " |      0.333333333333333314830\n",
      " |      \n",
      " |      as the former will ensure that the desired level of precision is\n",
      " |      obtained.\n",
      " |      \n",
      " |      See Also\n",
      " |      ========\n",
      " |      replace: replacement capable of doing wildcard-like matching,\n",
      " |               parsing of match, and conditional replacements\n",
      " |      xreplace: exact node replacement in expr tree; also capable of\n",
      " |                using matching rules\n",
      " |      sympy.core.evalf.EvalfMixin.evalf: calculates the given formula to a desired level of precision\n",
      " |  \n",
      " |  xreplace(self, rule)\n",
      " |      Replace occurrences of objects within the expression.\n",
      " |      \n",
      " |      Parameters\n",
      " |      ==========\n",
      " |      \n",
      " |      rule : dict-like\n",
      " |          Expresses a replacement rule\n",
      " |      \n",
      " |      Returns\n",
      " |      =======\n",
      " |      \n",
      " |      xreplace : the result of the replacement\n",
      " |      \n",
      " |      Examples\n",
      " |      ========\n",
      " |      \n",
      " |      >>> from sympy import symbols, pi, exp\n",
      " |      >>> x, y, z = symbols('x y z')\n",
      " |      >>> (1 + x*y).xreplace({x: pi})\n",
      " |      pi*y + 1\n",
      " |      >>> (1 + x*y).xreplace({x: pi, y: 2})\n",
      " |      1 + 2*pi\n",
      " |      \n",
      " |      Replacements occur only if an entire node in the expression tree is\n",
      " |      matched:\n",
      " |      \n",
      " |      >>> (x*y + z).xreplace({x*y: pi})\n",
      " |      z + pi\n",
      " |      >>> (x*y*z).xreplace({x*y: pi})\n",
      " |      x*y*z\n",
      " |      >>> (2*x).xreplace({2*x: y, x: z})\n",
      " |      y\n",
      " |      >>> (2*2*x).xreplace({2*x: y, x: z})\n",
      " |      4*z\n",
      " |      >>> (x + y + 2).xreplace({x + y: 2})\n",
      " |      x + y + 2\n",
      " |      >>> (x + 2 + exp(x + 2)).xreplace({x + 2: y})\n",
      " |      x + exp(y) + 2\n",
      " |      \n",
      " |      xreplace does not differentiate between free and bound symbols. In the\n",
      " |      following, subs(x, y) would not change x since it is a bound symbol,\n",
      " |      but xreplace does:\n",
      " |      \n",
      " |      >>> from sympy import Integral\n",
      " |      >>> Integral(x, (x, 1, 2*x)).xreplace({x: y})\n",
      " |      Integral(y, (y, 1, 2*y))\n",
      " |      \n",
      " |      Trying to replace x with an expression raises an error:\n",
      " |      \n",
      " |      >>> Integral(x, (x, 1, 2*x)).xreplace({x: 2*y}) # doctest: +SKIP\n",
      " |      ValueError: Invalid limits given: ((2*y, 1, 4*y),)\n",
      " |      \n",
      " |      See Also\n",
      " |      ========\n",
      " |      replace: replacement capable of doing wildcard-like matching,\n",
      " |               parsing of match, and conditional replacements\n",
      " |      subs: substitution of subexpressions as defined by the objects\n",
      " |            themselves.\n",
      " |  \n",
      " |  ----------------------------------------------------------------------\n",
      " |  Class methods inherited from sympy.core.basic.Basic:\n",
      " |  \n",
      " |  class_key() from sympy.core.assumptions.ManagedProperties\n",
      " |      Nice order of classes.\n",
      " |  \n",
      " |  fromiter(args, **assumptions) from sympy.core.assumptions.ManagedProperties\n",
      " |      Create a new object from an iterable.\n",
      " |      \n",
      " |      This is a convenience function that allows one to create objects from\n",
      " |      any iterable, without having to convert to a list or tuple first.\n",
      " |      \n",
      " |      Examples\n",
      " |      ========\n",
      " |      \n",
      " |      >>> from sympy import Tuple\n",
      " |      >>> Tuple.fromiter(i for i in range(5))\n",
      " |      (0, 1, 2, 3, 4)\n",
      " |  \n",
      " |  ----------------------------------------------------------------------\n",
      " |  Readonly properties inherited from sympy.core.basic.Basic:\n",
      " |  \n",
      " |  args\n",
      " |      Returns a tuple of arguments of 'self'.\n",
      " |      \n",
      " |      Examples\n",
      " |      ========\n",
      " |      \n",
      " |      >>> from sympy import cot\n",
      " |      >>> from sympy.abc import x, y\n",
      " |      \n",
      " |      >>> cot(x).args\n",
      " |      (x,)\n",
      " |      \n",
      " |      >>> cot(x).args[0]\n",
      " |      x\n",
      " |      \n",
      " |      >>> (x*y).args\n",
      " |      (x, y)\n",
      " |      \n",
      " |      >>> (x*y).args[1]\n",
      " |      y\n",
      " |      \n",
      " |      Notes\n",
      " |      =====\n",
      " |      \n",
      " |      Never use self._args, always use self.args.\n",
      " |      Only use _args in __new__ when creating a new function.\n",
      " |      Do not override .args() from Basic (so that it is easy to\n",
      " |      change the interface in the future if needed).\n",
      " |  \n",
      " |  assumptions0\n",
      " |      Return object `type` assumptions.\n",
      " |      \n",
      " |      For example:\n",
      " |      \n",
      " |        Symbol('x', real=True)\n",
      " |        Symbol('x', integer=True)\n",
      " |      \n",
      " |      are different objects. In other words, besides Python type (Symbol in\n",
      " |      this case), the initial assumptions are also forming their typeinfo.\n",
      " |      \n",
      " |      Examples\n",
      " |      ========\n",
      " |      \n",
      " |      >>> from sympy import Symbol\n",
      " |      >>> from sympy.abc import x\n",
      " |      >>> x.assumptions0\n",
      " |      {'commutative': True}\n",
      " |      >>> x = Symbol(\"x\", positive=True)\n",
      " |      >>> x.assumptions0\n",
      " |      {'commutative': True, 'complex': True, 'extended_negative': False,\n",
      " |       'extended_nonnegative': True, 'extended_nonpositive': False,\n",
      " |       'extended_nonzero': True, 'extended_positive': True, 'extended_real':\n",
      " |       True, 'finite': True, 'hermitian': True, 'imaginary': False,\n",
      " |       'infinite': False, 'negative': False, 'nonnegative': True,\n",
      " |       'nonpositive': False, 'nonzero': True, 'positive': True, 'real':\n",
      " |       True, 'zero': False}\n",
      " |  \n",
      " |  canonical_variables\n",
      " |      Return a dictionary mapping any variable defined in\n",
      " |      ``self.bound_symbols`` to Symbols that do not clash\n",
      " |      with any free symbols in the expression.\n",
      " |      \n",
      " |      Examples\n",
      " |      ========\n",
      " |      \n",
      " |      >>> from sympy import Lambda\n",
      " |      >>> from sympy.abc import x\n",
      " |      >>> Lambda(x, 2*x).canonical_variables\n",
      " |      {x: _0}\n",
      " |  \n",
      " |  expr_free_symbols\n",
      " |  \n",
      " |  free_symbols\n",
      " |      Return from the atoms of self those which are free symbols.\n",
      " |      \n",
      " |      Not all free symbols are ``Symbol``. Eg: IndexedBase('I')[0].free_symbols\n",
      " |      \n",
      " |      For most expressions, all symbols are free symbols. For some classes\n",
      " |      this is not true. e.g. Integrals use Symbols for the dummy variables\n",
      " |      which are bound variables, so Integral has a method to return all\n",
      " |      symbols except those. Derivative keeps track of symbols with respect\n",
      " |      to which it will perform a derivative; those are\n",
      " |      bound variables, too, so it has its own free_symbols method.\n",
      " |      \n",
      " |      Any other method that uses bound variables should implement a\n",
      " |      free_symbols method.\n",
      " |  \n",
      " |  func\n",
      " |      The top-level function in an expression.\n",
      " |      \n",
      " |      The following should hold for all objects::\n",
      " |      \n",
      " |          >> x == x.func(*x.args)\n",
      " |      \n",
      " |      Examples\n",
      " |      ========\n",
      " |      \n",
      " |      >>> from sympy.abc import x\n",
      " |      >>> a = 2*x\n",
      " |      >>> a.func\n",
      " |      <class 'sympy.core.mul.Mul'>\n",
      " |      >>> a.args\n",
      " |      (2, x)\n",
      " |      >>> a.func(*a.args)\n",
      " |      2*x\n",
      " |      >>> a == a.func(*a.args)\n",
      " |      True\n",
      " |  \n",
      " |  is_algebraic\n",
      " |  \n",
      " |  is_antihermitian\n",
      " |  \n",
      " |  is_commutative\n",
      " |  \n",
      " |  is_comparable\n",
      " |      Return True if self can be computed to a real number\n",
      " |      (or already is a real number) with precision, else False.\n",
      " |      \n",
      " |      Examples\n",
      " |      ========\n",
      " |      \n",
      " |      >>> from sympy import exp_polar, pi, I\n",
      " |      >>> (I*exp_polar(I*pi/2)).is_comparable\n",
      " |      True\n",
      " |      >>> (I*exp_polar(I*pi*2)).is_comparable\n",
      " |      False\n",
      " |      \n",
      " |      A False result does not mean that `self` cannot be rewritten\n",
      " |      into a form that would be comparable. For example, the\n",
      " |      difference computed below is zero but without simplification\n",
      " |      it does not evaluate to a zero with precision:\n",
      " |      \n",
      " |      >>> e = 2**pi*(1 + 2**pi)\n",
      " |      >>> dif = e - e.expand()\n",
      " |      >>> dif.is_comparable\n",
      " |      False\n",
      " |      >>> dif.n(2)._prec\n",
      " |      1\n",
      " |  \n",
      " |  is_complex\n",
      " |  \n",
      " |  is_composite\n",
      " |  \n",
      " |  is_even\n",
      " |  \n",
      " |  is_extended_negative\n",
      " |  \n",
      " |  is_extended_nonnegative\n",
      " |  \n",
      " |  is_extended_nonpositive\n",
      " |  \n",
      " |  is_extended_nonzero\n",
      " |  \n",
      " |  is_extended_positive\n",
      " |  \n",
      " |  is_extended_real\n",
      " |  \n",
      " |  is_finite\n",
      " |  \n",
      " |  is_hermitian\n",
      " |  \n",
      " |  is_imaginary\n",
      " |  \n",
      " |  is_infinite\n",
      " |  \n",
      " |  is_integer\n",
      " |  \n",
      " |  is_irrational\n",
      " |  \n",
      " |  is_negative\n",
      " |  \n",
      " |  is_noninteger\n",
      " |  \n",
      " |  is_nonnegative\n",
      " |  \n",
      " |  is_nonpositive\n",
      " |  \n",
      " |  is_nonzero\n",
      " |  \n",
      " |  is_odd\n",
      " |  \n",
      " |  is_polar\n",
      " |  \n",
      " |  is_positive\n",
      " |  \n",
      " |  is_prime\n",
      " |  \n",
      " |  is_rational\n",
      " |  \n",
      " |  is_real\n",
      " |  \n",
      " |  is_transcendental\n",
      " |  \n",
      " |  is_zero\n",
      " |  \n",
      " |  ----------------------------------------------------------------------\n",
      " |  Data and other attributes inherited from sympy.core.basic.Basic:\n",
      " |  \n",
      " |  __annotations__ = {'_args': 'tuple[Basic, ...]', '_mhash': 'int | None...\n",
      " |  \n",
      " |  is_Add = False\n",
      " |  \n",
      " |  is_AlgebraicNumber = False\n",
      " |  \n",
      " |  is_Atom = False\n",
      " |  \n",
      " |  is_Boolean = False\n",
      " |  \n",
      " |  is_Derivative = False\n",
      " |  \n",
      " |  is_Dummy = False\n",
      " |  \n",
      " |  is_Equality = False\n",
      " |  \n",
      " |  is_Float = False\n",
      " |  \n",
      " |  is_Function = False\n",
      " |  \n",
      " |  is_Indexed = False\n",
      " |  \n",
      " |  is_Integer = False\n",
      " |  \n",
      " |  is_MatAdd = False\n",
      " |  \n",
      " |  is_MatMul = False\n",
      " |  \n",
      " |  is_Matrix = False\n",
      " |  \n",
      " |  is_Mul = False\n",
      " |  \n",
      " |  is_Not = False\n",
      " |  \n",
      " |  is_Number = False\n",
      " |  \n",
      " |  is_NumberSymbol = False\n",
      " |  \n",
      " |  is_Order = False\n",
      " |  \n",
      " |  is_Piecewise = False\n",
      " |  \n",
      " |  is_Point = False\n",
      " |  \n",
      " |  is_Poly = False\n",
      " |  \n",
      " |  is_Pow = False\n",
      " |  \n",
      " |  is_Rational = False\n",
      " |  \n",
      " |  is_Relational = False\n",
      " |  \n",
      " |  is_Symbol = False\n",
      " |  \n",
      " |  is_Vector = False\n",
      " |  \n",
      " |  is_Wild = False\n",
      " |  \n",
      " |  is_symbol = False\n",
      " |  \n",
      " |  ----------------------------------------------------------------------\n",
      " |  Methods inherited from sympy.core.evalf.EvalfMixin:\n",
      " |  \n",
      " |  evalf(self, n=15, subs=None, maxn=100, chop=False, strict=False, quad=None, verbose=False)\n",
      " |      Evaluate the given formula to an accuracy of *n* digits.\n",
      " |      \n",
      " |      Parameters\n",
      " |      ==========\n",
      " |      \n",
      " |      subs : dict, optional\n",
      " |          Substitute numerical values for symbols, e.g.\n",
      " |          ``subs={x:3, y:1+pi}``. The substitutions must be given as a\n",
      " |          dictionary.\n",
      " |      \n",
      " |      maxn : int, optional\n",
      " |          Allow a maximum temporary working precision of maxn digits.\n",
      " |      \n",
      " |      chop : bool or number, optional\n",
      " |          Specifies how to replace tiny real or imaginary parts in\n",
      " |          subresults by exact zeros.\n",
      " |      \n",
      " |          When ``True`` the chop value defaults to standard precision.\n",
      " |      \n",
      " |          Otherwise the chop value is used to determine the\n",
      " |          magnitude of \"small\" for purposes of chopping.\n",
      " |      \n",
      " |          >>> from sympy import N\n",
      " |          >>> x = 1e-4\n",
      " |          >>> N(x, chop=True)\n",
      " |          0.000100000000000000\n",
      " |          >>> N(x, chop=1e-5)\n",
      " |          0.000100000000000000\n",
      " |          >>> N(x, chop=1e-4)\n",
      " |          0\n",
      " |      \n",
      " |      strict : bool, optional\n",
      " |          Raise ``PrecisionExhausted`` if any subresult fails to\n",
      " |          evaluate to full accuracy, given the available maxprec.\n",
      " |      \n",
      " |      quad : str, optional\n",
      " |          Choose algorithm for numerical quadrature. By default,\n",
      " |          tanh-sinh quadrature is used. For oscillatory\n",
      " |          integrals on an infinite interval, try ``quad='osc'``.\n",
      " |      \n",
      " |      verbose : bool, optional\n",
      " |          Print debug information.\n",
      " |      \n",
      " |      Notes\n",
      " |      =====\n",
      " |      \n",
      " |      When Floats are naively substituted into an expression,\n",
      " |      precision errors may adversely affect the result. For example,\n",
      " |      adding 1e16 (a Float) to 1 will truncate to 1e16; if 1e16 is\n",
      " |      then subtracted, the result will be 0.\n",
      " |      That is exactly what happens in the following:\n",
      " |      \n",
      " |      >>> from sympy.abc import x, y, z\n",
      " |      >>> values = {x: 1e16, y: 1, z: 1e16}\n",
      " |      >>> (x + y - z).subs(values)\n",
      " |      0\n",
      " |      \n",
      " |      Using the subs argument for evalf is the accurate way to\n",
      " |      evaluate such an expression:\n",
      " |      \n",
      " |      >>> (x + y - z).evalf(subs=values)\n",
      " |      1.00000000000000\n",
      " |  \n",
      " |  n = evalf(self, n=15, subs=None, maxn=100, chop=False, strict=False, quad=None, verbose=False)\n",
      "\n"
     ]
    }
   ],
   "source": [
    "help(Parabola)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 120,
   "id": "b7d681ef",
   "metadata": {},
   "outputs": [],
   "source": [
    "p=Parabola(Point(a,0),Line(x+a))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 121,
   "id": "7a59d3ab",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle - y^{2} + 4 \\left(- a + x + \\sqrt{a^{2}} \\operatorname{sign}{\\left(a \\right)}\\right) \\sqrt{a^{2}} \\operatorname{sign}{\\left(a \\right)}$"
      ],
      "text/plain": [
       "-y**2 + 4*(-a + x + sqrt(a**2)*sign(a))*sqrt(a**2)*sign(a)"
      ]
     },
     "execution_count": 121,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "p.equation()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 123,
   "id": "b6a215e4",
   "metadata": {
    "collapsed": true
   },
   "outputs": [
    {
     "ename": "TypeError",
     "evalue": "\nExpecting sequence of coordinates, not `Add`",
     "output_type": "error",
     "traceback": [
      "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
      "\u001b[0;31mTypeError\u001b[0m                                 Traceback (most recent call last)",
      "\u001b[0;32m/tmp/ipykernel_258896/3443711306.py\u001b[0m in \u001b[0;36m<module>\u001b[0;34m\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mp\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mParabola\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0my\u001b[0m\u001b[0;34m**\u001b[0m\u001b[0;36m2\u001b[0m\u001b[0;34m-\u001b[0m\u001b[0;36m4\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0mx\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m",
      "\u001b[0;32m~/anaconda3/lib/python3.9/site-packages/sympy/geometry/parabola.py\u001b[0m in \u001b[0;36m__new__\u001b[0;34m(cls, focus, directrix, **kwargs)\u001b[0m\n\u001b[1;32m     66\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m     67\u001b[0m         \u001b[0;32mif\u001b[0m \u001b[0mfocus\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 68\u001b[0;31m             \u001b[0mfocus\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mPoint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mfocus\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdim\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;36m2\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m     69\u001b[0m         \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m     70\u001b[0m             \u001b[0mfocus\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mPoint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m0\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m~/anaconda3/lib/python3.9/site-packages/sympy/geometry/point.py\u001b[0m in \u001b[0;36m__new__\u001b[0;34m(cls, *args, **kwargs)\u001b[0m\n\u001b[1;32m    123\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    124\u001b[0m         \u001b[0;32mif\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0mis_sequence\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mcoords\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 125\u001b[0;31m             raise TypeError(filldedent('''\n\u001b[0m\u001b[1;32m    126\u001b[0m                 Expecting sequence of coordinates, not `{}`'''\n\u001b[1;32m    127\u001b[0m                                        .format(func_name(coords))))\n",
      "\u001b[0;31mTypeError\u001b[0m: \nExpecting sequence of coordinates, not `Add`"
     ]
    }
   ],
   "source": [
    "p=Parabola(y**2-4*x)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 124,
   "id": "df57d38e",
   "metadata": {},
   "outputs": [],
   "source": [
    "p=symbols(\"p\",positive=True)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 125,
   "id": "25469b36",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\text{True}$"
      ],
      "text/plain": [
       "True"
      ]
     },
     "execution_count": 125,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "p>0"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 126,
   "id": "1809c8c8",
   "metadata": {},
   "outputs": [],
   "source": [
    "q=Parabola(Point(p/2,0),Line(x+p/2))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 127,
   "id": "8d937324",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle 2 p x - y^{2}$"
      ],
      "text/plain": [
       "2*p*x - y**2"
      ]
     },
     "execution_count": 127,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "q.equation()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 52,
   "id": "ece29d4d",
   "metadata": {},
   "outputs": [],
   "source": [
    "def point_axis_symmetry(p,l):\n",
    "    l1=l.parallel_line(p)\n",
    "    \n",
    "    c1=l1.equation(x,y).subs([(x,0),(y,0)])\n",
    "    c=l.equation(x,y).subs([(x,0),(y,0)])\n",
    "    \n",
    "    l2=Line(l.equation()+c-c1)\n",
    "    \n",
    "    l3=l.perpendicular_line(p)\n",
    "    \n",
    "    return list(Intersection(l2,l3))[0]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "d33bbecd",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": 129,
   "id": "cb6319eb",
   "metadata": {},
   "outputs": [],
   "source": [
    "M=Point(Rational(41,4),4)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 130,
   "id": "68e50e32",
   "metadata": {},
   "outputs": [],
   "source": [
    "l=Line(2*x-4*y-17)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 131,
   "id": "1786ea4f",
   "metadata": {},
   "outputs": [],
   "source": [
    "N=point_axis_symmetry(M,l)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 132,
   "id": "44370aa2",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\operatorname{Point2D}\\left(\\frac{51}{4}, -1\\right)$"
      ],
      "text/plain": [
       "Point2D(51/4, -1)"
      ]
     },
     "execution_count": 132,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "N"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 133,
   "id": "784f9efd",
   "metadata": {},
   "outputs": [],
   "source": [
    "c1=Circle(Point(2,1),sqrt(5))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 134,
   "id": "7d6be2ae",
   "metadata": {},
   "outputs": [],
   "source": [
    "c2=Circle(Point(0,0),2)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 135,
   "id": "faa3c518",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\left\\{\\operatorname{Point2D}\\left(0, 2\\right), \\operatorname{Point2D}\\left(\\frac{8}{5}, - \\frac{6}{5}\\right)\\right\\}$"
      ],
      "text/plain": [
       "{Point2D(0, 2), Point2D(8/5, -6/5)}"
      ]
     },
     "execution_count": 135,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "Intersection(c1,c2)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 136,
   "id": "765027b4",
   "metadata": {},
   "outputs": [],
   "source": [
    "l=Line(y+x/2)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 138,
   "id": "1f768252",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\left\\{\\operatorname{Point2D}\\left(- \\frac{4 \\sqrt{5}}{5}, \\frac{2 \\sqrt{5}}{5}\\right), \\operatorname{Point2D}\\left(\\frac{4 \\sqrt{5}}{5}, - \\frac{2 \\sqrt{5}}{5}\\right)\\right\\}$"
      ],
      "text/plain": [
       "{Point2D(-4*sqrt(5)/5, 2*sqrt(5)/5), Point2D(4*sqrt(5)/5, -2*sqrt(5)/5)}"
      ]
     },
     "execution_count": 138,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "Intersection(l,c2)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 140,
   "id": "036d2048",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\left\\{\\operatorname{Point2D}\\left(- \\frac{21}{5}, \\frac{28}{5}\\right), \\operatorname{Point2D}\\left(- \\frac{9}{5}, \\frac{12}{5}\\right)\\right\\}$"
      ],
      "text/plain": [
       "{Point2D(-21/5, 28/5), Point2D(-9/5, 12/5)}"
      ]
     },
     "execution_count": 140,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "Intersection(Circle(Point(-3,4),2),Line(y+4*x/3))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 143,
   "id": "df3fd072",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle -3 + \\frac{y^{2} + \\left(x - 2\\right)^{2}}{x^{2} + y^{2}}$"
      ],
      "text/plain": [
       "-3 + (y**2 + (x - 2)**2)/(x**2 + y**2)"
      ]
     },
     "execution_count": 143,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "expr=((x-2)**2+y**2)/(x**2+y**2)-3\n",
    "expr\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 147,
   "id": "71773cc9",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle x^{2} + 2 x + y^{2} - 2$"
      ],
      "text/plain": [
       "x**2 + 2*x + y**2 - 2"
      ]
     },
     "execution_count": 147,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "factor(expr).args[2]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 148,
   "id": "84aa026a",
   "metadata": {},
   "outputs": [],
   "source": [
    "c=Circle(factor(expr).args[2])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 149,
   "id": "decf26ab",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/svg+xml": [
       "<svg xmlns=\"http://www.w3.org/2000/svg\"\n",
       "            xmlns:xlink=\"http://www.w3.org/1999/xlink\"\n",
       "            width=\"100.0\" height=\"100.0\" viewBox=\"-3.07846096908265 -2.07846096908265 4.15692193816531 4.15692193816531\"\n",
       "            preserveAspectRatio=\"xMinYMin meet\">\n",
       "            <defs>\n",
       "                <marker id=\"markerCircle\" markerWidth=\"8\" markerHeight=\"8\"\n",
       "                    refx=\"5\" refy=\"5\" markerUnits=\"strokeWidth\">\n",
       "                    <circle cx=\"5\" cy=\"5\" r=\"1.5\" style=\"stroke: none; fill:#000000;\"/>\n",
       "                </marker>\n",
       "                <marker id=\"markerArrow\" markerWidth=\"13\" markerHeight=\"13\" refx=\"2\" refy=\"4\"\n",
       "                       orient=\"auto\" markerUnits=\"strokeWidth\">\n",
       "                    <path d=\"M2,2 L2,6 L6,4\" style=\"fill: #000000;\" />\n",
       "                </marker>\n",
       "                <marker id=\"markerReverseArrow\" markerWidth=\"13\" markerHeight=\"13\" refx=\"6\" refy=\"4\"\n",
       "                       orient=\"auto\" markerUnits=\"strokeWidth\">\n",
       "                    <path d=\"M6,2 L6,6 L2,4\" style=\"fill: #000000;\" />\n",
       "                </marker>\n",
       "            </defs><g transform=\"matrix(1,0,0,-1,0,0)\"><ellipse fill=\"#66cc99\" stroke=\"#555555\" stroke-width=\"0.0831384387633061\" opacity=\"0.6\" cx=\"-1.00000000000000\" cy=\"0\" rx=\"1.73205080756888\" ry=\"1.73205080756888\"/></g></svg>"
      ],
      "text/latex": [
       "$\\displaystyle \\operatorname{Circle}\\left(\\operatorname{Point2D}\\left(-1, 0\\right), \\sqrt{3}\\right)$"
      ],
      "text/plain": [
       "Circle(Point2D(-1, 0), sqrt(3))"
      ]
     },
     "execution_count": 149,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "c"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 150,
   "id": "31a84dc5",
   "metadata": {},
   "outputs": [],
   "source": [
    "c=Circle(x*(x-1)+y*(y-2)-4)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 151,
   "id": "ab8c7cdd",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/svg+xml": [
       "<svg xmlns=\"http://www.w3.org/2000/svg\"\n",
       "            xmlns:xlink=\"http://www.w3.org/1999/xlink\"\n",
       "            width=\"100.0\" height=\"100.0\" viewBox=\"-2.24954541697350 -1.74954541697350 5.49909083394701 5.49909083394701\"\n",
       "            preserveAspectRatio=\"xMinYMin meet\">\n",
       "            <defs>\n",
       "                <marker id=\"markerCircle\" markerWidth=\"8\" markerHeight=\"8\"\n",
       "                    refx=\"5\" refy=\"5\" markerUnits=\"strokeWidth\">\n",
       "                    <circle cx=\"5\" cy=\"5\" r=\"1.5\" style=\"stroke: none; fill:#000000;\"/>\n",
       "                </marker>\n",
       "                <marker id=\"markerArrow\" markerWidth=\"13\" markerHeight=\"13\" refx=\"2\" refy=\"4\"\n",
       "                       orient=\"auto\" markerUnits=\"strokeWidth\">\n",
       "                    <path d=\"M2,2 L2,6 L6,4\" style=\"fill: #000000;\" />\n",
       "                </marker>\n",
       "                <marker id=\"markerReverseArrow\" markerWidth=\"13\" markerHeight=\"13\" refx=\"6\" refy=\"4\"\n",
       "                       orient=\"auto\" markerUnits=\"strokeWidth\">\n",
       "                    <path d=\"M6,2 L6,6 L2,4\" style=\"fill: #000000;\" />\n",
       "                </marker>\n",
       "            </defs><g transform=\"matrix(1,0,0,-1,0,2.00000000000000)\"><ellipse fill=\"#66cc99\" stroke=\"#555555\" stroke-width=\"0.109981816678940\" opacity=\"0.6\" cx=\"0.500000000000000\" cy=\"1.00000000000000\" rx=\"2.29128784747792\" ry=\"2.29128784747792\"/></g></svg>"
      ],
      "text/latex": [
       "$\\displaystyle \\operatorname{Circle}\\left(\\operatorname{Point2D}\\left(\\frac{1}{2}, 1\\right), \\frac{\\sqrt{21}}{2}\\right)$"
      ],
      "text/plain": [
       "Circle(Point2D(1/2, 1), sqrt(21)/2)"
      ]
     },
     "execution_count": 151,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "c"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 154,
   "id": "70e4e823",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle x^{2} - x + y^{2} - 2 y - 4$"
      ],
      "text/plain": [
       "x**2 - x + y**2 - 2*y - 4"
      ]
     },
     "execution_count": 154,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "expand(c.equation())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 155,
   "id": "abd054e2",
   "metadata": {},
   "outputs": [],
   "source": [
    "c=Circle(Point(1,0),Point(3,2),Point(5,0))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 156,
   "id": "290f33da",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle y^{2} + \\left(x - 3\\right)^{2} - 4$"
      ],
      "text/plain": [
       "y**2 + (x - 3)**2 - 4"
      ]
     },
     "execution_count": 156,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "c.equation()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 157,
   "id": "768df97a",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle x^{2} - 6 x + y^{2} + 5$"
      ],
      "text/plain": [
       "x**2 - 6*x + y**2 + 5"
      ]
     },
     "execution_count": 157,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "expand(_)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 158,
   "id": "218d4ac3",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\left\\{\\operatorname{Point2D}\\left(\\frac{5}{3}, - \\frac{2 \\sqrt{5}}{3}\\right), \\operatorname{Point2D}\\left(\\frac{5}{3}, \\frac{2 \\sqrt{5}}{3}\\right)\\right\\}$"
      ],
      "text/plain": [
       "{Point2D(5/3, -2*sqrt(5)/3), Point2D(5/3, 2*sqrt(5)/3)}"
      ]
     },
     "execution_count": 158,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "Intersection(Circle(Point(Rational(3,2),0),Rational(3,2)),c)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 53,
   "id": "8df5699d",
   "metadata": {},
   "outputs": [],
   "source": [
    "def line_and_ellipse_quadratic(line,ellipse,x=x,y=y,first=True):\n",
    "    l_eq=line.equation(x,y)\n",
    "    e_eq=ellipse.equation(x,y)\n",
    "    if(not first):\n",
    "        x,y=y,x\n",
    "        \n",
    "    eq=e_eq.subs(y,list(solveset(l_eq,y))[0])\n",
    "    expr_check=factor(expand(eq)*(ellipse.hradius*ellipse.vradius)**2)\n",
    "    if(type(expr_check)==Mul):\n",
    "        answer=1\n",
    "        for expr in expr_check.args:\n",
    "            if(expr.has(x)):\n",
    "                answer=answer*expr\n",
    "        return collect(answer,x)\n",
    "    if(type(expr_check)==Add):\n",
    "        return collect(expr_check,x)\n",
    "    else:\n",
    "        raise(\"something wrong!\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 787,
   "id": "39393fa5",
   "metadata": {},
   "outputs": [],
   "source": [
    "def line_and_quadratic(line,quadra,x=x,y=y,first=True):\n",
    "    l_eq=line.equation(x,y)\n",
    "    e_eq=quadra.equation(x,y)\n",
    "    if(not first):\n",
    "        x,y=y,x\n",
    "        \n",
    "    eq=e_eq.subs(y,list(solveset(l_eq,y))[0])\n",
    "    expr_check=factor(expand(eq))\n",
    "    if(type(expr_check)==Mul):\n",
    "        answer=1\n",
    "        for expr in expr_check.args:\n",
    "            if(expr.has(x)):\n",
    "                answer=answer*expr\n",
    "        return collect(answer,x)\n",
    "    if(type(expr_check)==Add):\n",
    "        return collect(expr_check,x)\n",
    "    else:\n",
    "        raise(\"something wrong!\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 164,
   "id": "fc3c20cd",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle 4 m^{2} + 8 m x + 7 x^{2} - 12$"
      ],
      "text/plain": [
       "4*m**2 + 8*m*x + 7*x**2 - 12"
      ]
     },
     "execution_count": 164,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "line_and_ellipse_quadratic(Line(x+y+m),Ellipse(Point(0,0),2,sqrt(3)))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 165,
   "id": "211a617b",
   "metadata": {},
   "outputs": [],
   "source": [
    "q=quadratic_function(_)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 167,
   "id": "69f24328",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\left\\{- \\sqrt{7}, \\sqrt{7}\\right\\}$"
      ],
      "text/plain": [
       "{-sqrt(7), sqrt(7)}"
      ]
     },
     "execution_count": 167,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "solveset(q.delta,m,Reals)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "15aebee0",
   "metadata": {},
   "source": [
    "####  过一一点，与某一直线垂直的直线。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 169,
   "id": "ae0f6432",
   "metadata": {},
   "outputs": [],
   "source": [
    "l=Line(x-2*y+1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 170,
   "id": "60c9cb05",
   "metadata": {},
   "outputs": [],
   "source": [
    "n=Line(3*x-y+5)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 171,
   "id": "418c35c5",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle - 3 x + y - 5$"
      ],
      "text/plain": [
       "-3*x + y - 5"
      ]
     },
     "execution_count": 171,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "n.equation()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 172,
   "id": "1708bb99",
   "metadata": {},
   "outputs": [],
   "source": [
    "m=Line(2*x-y+6)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 173,
   "id": "e8a39816",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle - 2 x + y - 6$"
      ],
      "text/plain": [
       "-2*x + y - 6"
      ]
     },
     "execution_count": 173,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "m.equation()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 174,
   "id": "73bbce02",
   "metadata": {},
   "outputs": [],
   "source": [
    "P=list(Intersection(n,m))[0]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 175,
   "id": "736e99ed",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\operatorname{Point2D}\\left(1, 8\\right)$"
      ],
      "text/plain": [
       "Point2D(1, 8)"
      ]
     },
     "execution_count": 175,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "P"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 176,
   "id": "330f6041",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle - \\frac{x}{2} + y - \\frac{1}{2}$"
      ],
      "text/plain": [
       "-x/2 + y - 1/2"
      ]
     },
     "execution_count": 176,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "l.equation()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 179,
   "id": "82a93706",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle - x - \\frac{y}{2} + 5$"
      ],
      "text/plain": [
       "-x - y/2 + 5"
      ]
     },
     "execution_count": 179,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "l.perpendicular_line(P).equation()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 181,
   "id": "ac7e0adb",
   "metadata": {},
   "outputs": [],
   "source": [
    "from sympy.abc import m,n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 182,
   "id": "6a878c62",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle - 7 m + x \\left(m + 1\\right) - y - 4$"
      ],
      "text/plain": [
       "-7*m + x*(m + 1) - y - 4"
      ]
     },
     "execution_count": 182,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "expr=(m+1)*x-y-7*m-4\n",
    "expr"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 184,
   "id": "f192c1d4",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle m \\left(x - 7\\right) + x - y - 4$"
      ],
      "text/plain": [
       "m*(x - 7) + x - y - 4"
      ]
     },
     "execution_count": 184,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "collect(expand(expr),m)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 185,
   "id": "fac0fed5",
   "metadata": {},
   "outputs": [],
   "source": [
    "A=Point(-3,1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 186,
   "id": "9807788a",
   "metadata": {},
   "outputs": [],
   "source": [
    "B=Point(3,-3)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 187,
   "id": "9c99202c",
   "metadata": {},
   "outputs": [],
   "source": [
    "C=Point(1,7)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 189,
   "id": "8efc20bc",
   "metadata": {},
   "outputs": [],
   "source": [
    "t=Triangle(A,B,C)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 194,
   "id": "a2bc24e0",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "2*sqrt(13)\n",
      "2*sqrt(26)\n",
      "2*sqrt(13)\n"
     ]
    }
   ],
   "source": [
    "for seg in t.sides:\n",
    "    print(seg.length)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 196,
   "id": "335dbf95",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "True"
      ]
     },
     "execution_count": 196,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "t.is_right()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 198,
   "id": "a276a5cc",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "True"
      ]
     },
     "execution_count": 198,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "t.is_isosceles()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 199,
   "id": "663abb47",
   "metadata": {},
   "outputs": [],
   "source": [
    "l1=Line(a*x+y+1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 200,
   "id": "a2ed852b",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle a x + y + 1$"
      ],
      "text/plain": [
       "a*x + y + 1"
      ]
     },
     "execution_count": 200,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "l1.equation()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 201,
   "id": "63004b02",
   "metadata": {},
   "outputs": [],
   "source": [
    "l2=Line(2*x-b*y-1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 202,
   "id": "640bb835",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle y - \\frac{2 x}{b} + \\frac{1}{b}$"
      ],
      "text/plain": [
       "y - 2*x/b + 1/b"
      ]
     },
     "execution_count": 202,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "l2.equation()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 204,
   "id": "45f40d96",
   "metadata": {},
   "outputs": [],
   "source": [
    "M=list(Intersection(l1,l2))[0]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 205,
   "id": "d74a9f74",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\operatorname{Point2D}\\left(\\frac{1 - b}{a b + 2}, \\frac{- a - 2}{a b + 2}\\right)$"
      ],
      "text/plain": [
       "Point2D((1 - b)/(a*b + 2), (-a - 2)/(a*b + 2))"
      ]
     },
     "execution_count": 205,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "M"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 206,
   "id": "71851f53",
   "metadata": {},
   "outputs": [],
   "source": [
    "c=Circle(Point(-2,3),sqrt(2))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 207,
   "id": "d49c7daf",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\left(x + 2\\right)^{2} + \\left(y - 3\\right)^{2} - 2$"
      ],
      "text/plain": [
       "(x + 2)**2 + (y - 3)**2 - 2"
      ]
     },
     "execution_count": 207,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "c.equation()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 208,
   "id": "9d2c4977",
   "metadata": {},
   "outputs": [],
   "source": [
    "l=Line(x+y-1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 209,
   "id": "3cb89ce7",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle x + y - 1$"
      ],
      "text/plain": [
       "x + y - 1"
      ]
     },
     "execution_count": 209,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "l.equation()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 210,
   "id": "47fb610d",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\left\\{\\operatorname{Point2D}\\left(-3, 4\\right), \\operatorname{Point2D}\\left(-1, 2\\right)\\right\\}$"
      ],
      "text/plain": [
       "{Point2D(-3, 4), Point2D(-1, 2)}"
      ]
     },
     "execution_count": 210,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "Intersection(l,c)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 211,
   "id": "5affeb1f",
   "metadata": {},
   "outputs": [],
   "source": [
    "A=Point(0,0)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 212,
   "id": "a5b5adfc",
   "metadata": {},
   "outputs": [],
   "source": [
    "B=Point(3,0)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 213,
   "id": "915c42b9",
   "metadata": {},
   "outputs": [],
   "source": [
    "C=Point(1,2)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 214,
   "id": "e0040500",
   "metadata": {},
   "outputs": [],
   "source": [
    "t=Triangle(A,B,C)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 217,
   "id": "1f4fcecd",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\operatorname{Point2D}\\left(1, 1\\right)$"
      ],
      "text/plain": [
       "Point2D(1, 1)"
      ]
     },
     "execution_count": 217,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "t.orthocenter"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 218,
   "id": "ed5730ce",
   "metadata": {},
   "outputs": [],
   "source": [
    "l1=Line(2*x+y-6)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 219,
   "id": "1cb511fd",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle 2 x + y - 6$"
      ],
      "text/plain": [
       "2*x + y - 6"
      ]
     },
     "execution_count": 219,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "l1.equation()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 225,
   "id": "680ed67e",
   "metadata": {},
   "outputs": [],
   "source": [
    "c=Circle(Point(1,-1),(5))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 226,
   "id": "187ac8a1",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\left(x - 1\\right)^{2} + \\left(y + 1\\right)^{2} - 25$"
      ],
      "text/plain": [
       "(x - 1)**2 + (y + 1)**2 - 25"
      ]
     },
     "execution_count": 226,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "c.equation()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 227,
   "id": "574e0143",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\left\\{\\operatorname{Point2D}\\left(1, 4\\right), \\operatorname{Point2D}\\left(5, -4\\right)\\right\\}$"
      ],
      "text/plain": [
       "{Point2D(1, 4), Point2D(5, -4)}"
      ]
     },
     "execution_count": 227,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "Intersection(l1,c)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 228,
   "id": "63f4df32",
   "metadata": {},
   "outputs": [],
   "source": [
    "P,Q=Intersection(l1,c)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 229,
   "id": "5332c53e",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\operatorname{Point2D}\\left(1, 4\\right)$"
      ],
      "text/plain": [
       "Point2D(1, 4)"
      ]
     },
     "execution_count": 229,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "P"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 230,
   "id": "895c5bdf",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\operatorname{Point2D}\\left(5, -4\\right)$"
      ],
      "text/plain": [
       "Point2D(5, -4)"
      ]
     },
     "execution_count": 230,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "Q"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 231,
   "id": "fcc16dca",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle x - 1$"
      ],
      "text/plain": [
       "x - 1"
      ]
     },
     "execution_count": 231,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "Line(P,Point(1,-1)).equation()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 232,
   "id": "416771f1",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle - 3 x - 4 y - 1$"
      ],
      "text/plain": [
       "-3*x - 4*y - 1"
      ]
     },
     "execution_count": 232,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "Line(Q,Point(1,-1)).equation()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 233,
   "id": "a779dfd1",
   "metadata": {},
   "outputs": [],
   "source": [
    "q=quadratic_function(x**2+(3-x)**2)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 234,
   "id": "59ea5d80",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle 2 \\left(x - \\frac{3}{2}\\right)^{2} + \\frac{9}{2}$"
      ],
      "text/plain": [
       "2*(x - 3/2)**2 + 9/2"
      ]
     },
     "execution_count": 234,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "q.to_symmetry_expr()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 235,
   "id": "c223411c",
   "metadata": {},
   "outputs": [],
   "source": [
    "l=Line(Point(-2,-4),Point(1,5))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 237,
   "id": "096581ea",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle - 3 \\cdot \\left(3 x - y + 2\\right)$"
      ],
      "text/plain": [
       "-3*(3*x - y + 2)"
      ]
     },
     "execution_count": 237,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "factor(l.equation())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 238,
   "id": "44514541",
   "metadata": {},
   "outputs": [],
   "source": [
    "l2=Segment(Point(-2,-4),Point(1,5))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 240,
   "id": "d7938ef9",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle - 3 x - 9 y + 3$"
      ],
      "text/plain": [
       "-3*x - 9*y + 3"
      ]
     },
     "execution_count": 240,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "l2.perpendicular_bisector().equation()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 241,
   "id": "51249482",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\operatorname{Point2D}\\left(- \\frac{1}{2}, \\frac{1}{2}\\right)$"
      ],
      "text/plain": [
       "Point2D(-1/2, 1/2)"
      ]
     },
     "execution_count": 241,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "l2.midpoint"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 242,
   "id": "9b14cbe3",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\left\\{1\\right\\}$"
      ],
      "text/plain": [
       "{1}"
      ]
     },
     "execution_count": 242,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "solveset(abs(x-3)-abs(x+1),x,Reals)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 243,
   "id": "dfa94fc1",
   "metadata": {},
   "outputs": [],
   "source": [
    "A=Point(7,8)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 244,
   "id": "0929cbaf",
   "metadata": {},
   "outputs": [],
   "source": [
    "B=Point(10,4)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 245,
   "id": "8a4fe164",
   "metadata": {},
   "outputs": [],
   "source": [
    "C=Point(2,-4)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 246,
   "id": "64d37587",
   "metadata": {},
   "outputs": [],
   "source": [
    "t=Triangle(A,B,C)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 247,
   "id": "4ef49a5e",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle -28$"
      ],
      "text/plain": [
       "-28"
      ]
     },
     "execution_count": 247,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "t.area"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 250,
   "id": "73029810",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle 4 x + 3 y - 52$"
      ],
      "text/plain": [
       "4*x + 3*y - 52"
      ]
     },
     "execution_count": 250,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "Line(A,B).equation()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 251,
   "id": "28abe8bc",
   "metadata": {},
   "outputs": [],
   "source": [
    "A=Point(1,1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 252,
   "id": "6c3d417a",
   "metadata": {},
   "outputs": [],
   "source": [
    "B=Point(2,-2)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 253,
   "id": "ba5e09b9",
   "metadata": {},
   "outputs": [],
   "source": [
    "C=Point(-3,3)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 254,
   "id": "aac6b6a0",
   "metadata": {},
   "outputs": [],
   "source": [
    "t=Triangle(A,B,C)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 256,
   "id": "d01a91c6",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/svg+xml": [
       "<svg xmlns=\"http://www.w3.org/2000/svg\"\n",
       "            xmlns:xlink=\"http://www.w3.org/1999/xlink\"\n",
       "            width=\"100.0\" height=\"100.0\" viewBox=\"1.80000000000000 -2.20000000000000 1.40000000000000 2.40000000000000\"\n",
       "            preserveAspectRatio=\"xMinYMin meet\">\n",
       "            <defs>\n",
       "                <marker id=\"markerCircle\" markerWidth=\"8\" markerHeight=\"8\"\n",
       "                    refx=\"5\" refy=\"5\" markerUnits=\"strokeWidth\">\n",
       "                    <circle cx=\"5\" cy=\"5\" r=\"1.5\" style=\"stroke: none; fill:#000000;\"/>\n",
       "                </marker>\n",
       "                <marker id=\"markerArrow\" markerWidth=\"13\" markerHeight=\"13\" refx=\"2\" refy=\"4\"\n",
       "                       orient=\"auto\" markerUnits=\"strokeWidth\">\n",
       "                    <path d=\"M2,2 L2,6 L6,4\" style=\"fill: #000000;\" />\n",
       "                </marker>\n",
       "                <marker id=\"markerReverseArrow\" markerWidth=\"13\" markerHeight=\"13\" refx=\"6\" refy=\"4\"\n",
       "                       orient=\"auto\" markerUnits=\"strokeWidth\">\n",
       "                    <path d=\"M6,2 L6,6 L2,4\" style=\"fill: #000000;\" />\n",
       "                </marker>\n",
       "            </defs><g transform=\"matrix(1,0,0,-1,0,-2.00000000000000)\"><path fill-rule=\"evenodd\" fill=\"#66cc99\" stroke=\"#555555\" stroke-width=\"0.0480000000000000\" opacity=\"0.6\" d=\"M 2.00000000000000,-2.00000000000000 L 3.00000000000000,0\" /></g></svg>"
      ],
      "text/latex": [
       "$\\displaystyle \\operatorname{Segment2D}\\left(\\operatorname{Point2D}\\left(2, -2\\right), \\operatorname{Point2D}\\left(3, 0\\right)\\right)$"
      ],
      "text/plain": [
       "Segment2D(Point2D(2, -2), Point2D(3, 0))"
      ]
     },
     "execution_count": 256,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "t.altitudes[B]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 258,
   "id": "921b9084",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle - 2 x + y + 6$"
      ],
      "text/plain": [
       "-2*x + y + 6"
      ]
     },
     "execution_count": 258,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "Line(t.altitudes[B]).equation()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 262,
   "id": "b933c3f0",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\sqrt{5}$"
      ],
      "text/plain": [
       "sqrt(5)"
      ]
     },
     "execution_count": 262,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "(t.altitudes[B]).length"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 263,
   "id": "40108446",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle - 5 k + x \\left(3 k + 1\\right) + y \\left(2 k + 1\\right) - 2$"
      ],
      "text/plain": [
       "-5*k + x*(3*k + 1) + y*(2*k + 1) - 2"
      ]
     },
     "execution_count": 263,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "expr=(1+3*k)*x+(1+2*k)*y-(2+5*k)\n",
    "expr"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 265,
   "id": "c9ae6c82",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle k \\left(3 x + 2 y - 5\\right) + x + y - 2$"
      ],
      "text/plain": [
       "k*(3*x + 2*y - 5) + x + y - 2"
      ]
     },
     "execution_count": 265,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "collect(expand(expr),k)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 266,
   "id": "8f27c325",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle - \\sin^{2}{\\left(x \\right)} - 4 \\cos{\\left(x \\right)} + 6$"
      ],
      "text/plain": [
       "-sin(x)**2 - 4*cos(x) + 6"
      ]
     },
     "execution_count": 266,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "expr=-sin(x)**2-4*cos(x)+6\n",
    "expr"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 270,
   "id": "fc280e59",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\left[2, 10\\right]$"
      ],
      "text/plain": [
       "Interval(2, 10)"
      ]
     },
     "execution_count": 270,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "function_range(expr,x,Reals)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 271,
   "id": "841dc660",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle 65$"
      ],
      "text/plain": [
       "65"
      ]
     },
     "execution_count": 271,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "sqrt(16**2+63**2)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 132,
   "id": "b801044b",
   "metadata": {},
   "outputs": [],
   "source": [
    "def five_points(A,omega,phi,f=\"sin\"):\n",
    "    x_origin_points=[pi/2*i for i in range(5)]\n",
    "    x_points=[]\n",
    "    for i in x_origin_points:\n",
    "        x_points.append(simplify(((i-phi)/omega)))\n",
    "    if(f==\"sin\"):\n",
    "        y_points=[0,A,0,-A,0]\n",
    "    elif(f==\"cos\"):\n",
    "        y_points=[A,0,-A,0,A]\n",
    "\n",
    "    return list(zip(x_points,y_points))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 273,
   "id": "b48835f4",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[(-pi/8, 0), (pi/8, 2), (3*pi/8, 0), (5*pi/8, -2), (7*pi/8, 0)]"
      ]
     },
     "execution_count": 273,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "five_points(2,2,pi/4)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 276,
   "id": "3926eaa8",
   "metadata": {},
   "outputs": [],
   "source": [
    "q=quadratic_function(S(4),-9,5)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 277,
   "id": "551cf08d",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle 4 \\left(x - \\frac{9}{8}\\right)^{2} - \\frac{1}{16}$"
      ],
      "text/plain": [
       "4*(x - 9/8)**2 - 1/16"
      ]
     },
     "execution_count": 277,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "q.to_symmetry_expr()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 278,
   "id": "aadc15db",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle 4 \\sin{\\left(2 x \\right)} - 9 \\left|{\\sin{\\left(x \\right)}}\\right| - 9 \\left|{\\cos{\\left(x \\right)}}\\right| + 9$"
      ],
      "text/plain": [
       "4*sin(2*x) - 9*Abs(sin(x)) - 9*Abs(cos(x)) + 9"
      ]
     },
     "execution_count": 278,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "expr=9*(1-abs(sin(x))-abs(cos(x)))+4*sin(2*x)\n",
    "expr"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 279,
   "id": "2f4feafa",
   "metadata": {
    "collapsed": true
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/plain": [
       "<sympy.plotting.plot.Plot at 0x7f44b8a90ee0>"
      ]
     },
     "execution_count": 279,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "plot(expr,(x,0,pi))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 280,
   "id": "6fdb5ef3",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\left\\{- \\frac{13}{4}, 1\\right\\}$"
      ],
      "text/plain": [
       "{-13/4, 1}"
      ]
     },
     "execution_count": 280,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "solveset(-4*x**2-9*x+13,x,Reals)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "id": "538d1615",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\left[\\begin{matrix}2 \\cos{\\left(t \\right)}\\\\2 \\sin{\\left(t \\right)}\\end{matrix}\\right]$"
      ],
      "text/plain": [
       "Matrix([\n",
       "[2*cos(t)],\n",
       "[2*sin(t)]])"
      ]
     },
     "execution_count": 17,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "P=Matrix([2*cos(t),2*sin(t)])\n",
    "P"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "id": "6dd1e268",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\left[\\begin{matrix}- \\sqrt{3}\\\\-1\\end{matrix}\\right]$"
      ],
      "text/plain": [
       "Matrix([\n",
       "[-sqrt(3)],\n",
       "[      -1]])"
      ]
     },
     "execution_count": 18,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "B=Matrix([-sqrt(3),-1])\n",
    "B"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "id": "23a8f602",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\left[\\begin{matrix}\\sqrt{3}\\\\-1\\end{matrix}\\right]$"
      ],
      "text/plain": [
       "Matrix([\n",
       "[sqrt(3)],\n",
       "[     -1]])"
      ]
     },
     "execution_count": 19,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "C=Matrix([sqrt(3),-1])\n",
    "C"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "id": "fa336dfa",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\left[\\begin{matrix}0\\\\2\\end{matrix}\\right]$"
      ],
      "text/plain": [
       "Matrix([\n",
       "[0],\n",
       "[2]])"
      ]
     },
     "execution_count": 21,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "A=Matrix([0,2])\n",
    "A"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "id": "fb66b571",
   "metadata": {},
   "outputs": [],
   "source": [
    "PA=A-P"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "id": "1795ea1f",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\left[\\begin{matrix}- 2 \\cos{\\left(t \\right)}\\\\2 - 2 \\sin{\\left(t \\right)}\\end{matrix}\\right]$"
      ],
      "text/plain": [
       "Matrix([\n",
       "[   -2*cos(t)],\n",
       "[2 - 2*sin(t)]])"
      ]
     },
     "execution_count": 23,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "PA"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "id": "bc40740c",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\left[\\begin{matrix}- 2 \\cos{\\left(t \\right)} - \\sqrt{3}\\\\- 2 \\sin{\\left(t \\right)} - 1\\end{matrix}\\right]$"
      ],
      "text/plain": [
       "Matrix([\n",
       "[-2*cos(t) - sqrt(3)],\n",
       "[      -2*sin(t) - 1]])"
      ]
     },
     "execution_count": 24,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "PB=B-P\n",
    "PB"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "id": "ca982291",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\left[\\begin{matrix}- 2 \\cos{\\left(t \\right)} + \\sqrt{3}\\\\- 2 \\sin{\\left(t \\right)} - 1\\end{matrix}\\right]$"
      ],
      "text/plain": [
       "Matrix([\n",
       "[-2*cos(t) + sqrt(3)],\n",
       "[      -2*sin(t) - 1]])"
      ]
     },
     "execution_count": 25,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "PC=C-P\n",
    "PC"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "id": "13ed6e2f",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\left[\\begin{matrix}\\left(2 - 2 \\sin{\\left(t \\right)}\\right) \\left(- 2 \\sin{\\left(t \\right)} - 1\\right) + \\left(- 2 \\sin{\\left(t \\right)} - 1\\right)^{2} + \\left(- 2 \\cos{\\left(t \\right)} - \\sqrt{3}\\right) \\left(- 2 \\cos{\\left(t \\right)} + \\sqrt{3}\\right) - 2 \\left(- 2 \\cos{\\left(t \\right)} - \\sqrt{3}\\right) \\cos{\\left(t \\right)}\\end{matrix}\\right]$"
      ],
      "text/plain": [
       "Matrix([[(2 - 2*sin(t))*(-2*sin(t) - 1) + (-2*sin(t) - 1)**2 + (-2*cos(t) - sqrt(3))*(-2*cos(t) + sqrt(3)) - 2*(-2*cos(t) - sqrt(3))*cos(t)]])"
      ]
     },
     "execution_count": 26,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "PA.T*PB+PB.T*PC"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "id": "a30d8945",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\left[\\begin{matrix}4 \\sin{\\left(t + \\frac{\\pi}{3} \\right)} + 4\\end{matrix}\\right]$"
      ],
      "text/plain": [
       "Matrix([[4*sin(t + pi/3) + 4]])"
      ]
     },
     "execution_count": 27,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "simplify(PA.T*PB+PB.T*PC)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "id": "c2acf210",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/svg+xml": [
       "<svg xmlns=\"http://www.w3.org/2000/svg\"\n",
       "            xmlns:xlink=\"http://www.w3.org/1999/xlink\"\n",
       "            width=\"100.0\" height=\"100.0\" viewBox=\"-1.20000000000000 -1.20000000000000 2.40000000000000 2.40000000000000\"\n",
       "            preserveAspectRatio=\"xMinYMin meet\">\n",
       "            <defs>\n",
       "                <marker id=\"markerCircle\" markerWidth=\"8\" markerHeight=\"8\"\n",
       "                    refx=\"5\" refy=\"5\" markerUnits=\"strokeWidth\">\n",
       "                    <circle cx=\"5\" cy=\"5\" r=\"1.5\" style=\"stroke: none; fill:#000000;\"/>\n",
       "                </marker>\n",
       "                <marker id=\"markerArrow\" markerWidth=\"13\" markerHeight=\"13\" refx=\"2\" refy=\"4\"\n",
       "                       orient=\"auto\" markerUnits=\"strokeWidth\">\n",
       "                    <path d=\"M2,2 L2,6 L6,4\" style=\"fill: #000000;\" />\n",
       "                </marker>\n",
       "                <marker id=\"markerReverseArrow\" markerWidth=\"13\" markerHeight=\"13\" refx=\"6\" refy=\"4\"\n",
       "                       orient=\"auto\" markerUnits=\"strokeWidth\">\n",
       "                    <path d=\"M6,2 L6,6 L2,4\" style=\"fill: #000000;\" />\n",
       "                </marker>\n",
       "            </defs><g transform=\"matrix(1,0,0,-1,0,0)\"><ellipse fill=\"#66cc99\" stroke=\"#555555\" stroke-width=\"0.0480000000000000\" opacity=\"0.6\" cx=\"0\" cy=\"0\" rx=\"1.00000000000000\" ry=\"1.00000000000000\"/></g></svg>"
      ],
      "text/latex": [
       "$\\displaystyle \\operatorname{Circle}\\left(\\operatorname{Point2D}\\left(0, 0\\right), 1\\right)$"
      ],
      "text/plain": [
       "Circle(Point2D(0, 0), 1)"
      ]
     },
     "execution_count": 28,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "c=Circle(Point(0,0),1)\n",
    "c"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "id": "c4178200",
   "metadata": {},
   "outputs": [],
   "source": [
    "l1,l2=c.tangent_lines(Point(2,-2))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "id": "0ad96afb",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle - \\frac{4}{3} + \\frac{\\sqrt{7}}{3}$"
      ],
      "text/plain": [
       "-4/3 + sqrt(7)/3"
      ]
     },
     "execution_count": 30,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "l1.slope"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "id": "b007b23c",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle - \\frac{4}{3} - \\frac{\\sqrt{7}}{3}$"
      ],
      "text/plain": [
       "-4/3 - sqrt(7)/3"
      ]
     },
     "execution_count": 31,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "l2.slope"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 36,
   "id": "7b863972",
   "metadata": {
    "collapsed": true
   },
   "outputs": [
    {
     "ename": "ValueError",
     "evalue": "\nAbsolute values cannot be inverted in the complex domain.",
     "output_type": "error",
     "traceback": [
      "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
      "\u001b[0;31mValueError\u001b[0m                                Traceback (most recent call last)",
      "\u001b[0;32m/tmp/ipykernel_5587/3746355926.py\u001b[0m in \u001b[0;36m<module>\u001b[0;34m\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0msolveset\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mabs\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mz\u001b[0m\u001b[0;34m-\u001b[0m\u001b[0;36m2\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m-\u001b[0m\u001b[0;36m2\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0mz\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0mComplexes\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m",
      "\u001b[0;32m~/anaconda3/lib/python3.9/site-packages/sympy/solvers/solveset.py\u001b[0m in \u001b[0;36msolveset\u001b[0;34m(f, symbol, domain)\u001b[0m\n\u001b[1;32m   2230\u001b[0m     \u001b[0;32mif\u001b[0m \u001b[0msymbol\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0;32min\u001b[0m \u001b[0m_rc\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m   2231\u001b[0m         \u001b[0mx\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0m_rc\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mdomain\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mis_subset\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mS\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mReals\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32melse\u001b[0m \u001b[0m_rc\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 2232\u001b[0;31m         \u001b[0mrv\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0msolveset\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mf\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mxreplace\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m{\u001b[0m\u001b[0msymbol\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mx\u001b[0m\u001b[0;34m}\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mx\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdomain\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m   2233\u001b[0m         \u001b[0;31m# try to use the original symbol if possible\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m   2234\u001b[0m         \u001b[0;32mtry\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m~/anaconda3/lib/python3.9/site-packages/sympy/solvers/solveset.py\u001b[0m in \u001b[0;36msolveset\u001b[0;34m(f, symbol, domain)\u001b[0m\n\u001b[1;32m   2254\u001b[0m     \u001b[0mf\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mpiecewise_fold\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mf\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m   2255\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 2256\u001b[0;31m     \u001b[0;32mreturn\u001b[0m \u001b[0m_solveset\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mf\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0msymbol\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdomain\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0m_check\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mTrue\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m   2257\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m   2258\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m~/anaconda3/lib/python3.9/site-packages/sympy/solvers/solveset.py\u001b[0m in \u001b[0;36m_solveset\u001b[0;34m(f, symbol, domain, _check)\u001b[0m\n\u001b[1;32m   1088\u001b[0m                                                  solver)\n\u001b[1;32m   1089\u001b[0m                     \u001b[0;32melif\u001b[0m \u001b[0mequation\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mhas\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mAbs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1090\u001b[0;31m                         \u001b[0mresult\u001b[0m \u001b[0;34m+=\u001b[0m \u001b[0m_solve_abs\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mf\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0msymbol\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdomain\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m   1091\u001b[0m                     \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m   1092\u001b[0m                         \u001b[0mresult_rational\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0m_solve_as_rational\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mequation\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0msymbol\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdomain\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m~/anaconda3/lib/python3.9/site-packages/sympy/solvers/solveset.py\u001b[0m in \u001b[0;36m_solve_abs\u001b[0;34m(f, symbol, domain)\u001b[0m\n\u001b[1;32m    896\u001b[0m     \u001b[0;34m\"\"\" Helper function to solve equation involving absolute value function \"\"\"\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    897\u001b[0m     \u001b[0;32mif\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0mdomain\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mis_subset\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mS\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mReals\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 898\u001b[0;31m         raise ValueError(filldedent('''\n\u001b[0m\u001b[1;32m    899\u001b[0m             \u001b[0mAbsolute\u001b[0m \u001b[0mvalues\u001b[0m \u001b[0mcannot\u001b[0m \u001b[0mbe\u001b[0m \u001b[0minverted\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mthe\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    900\u001b[0m             complex domain.'''))\n",
      "\u001b[0;31mValueError\u001b[0m: \nAbsolute values cannot be inverted in the complex domain."
     ]
    }
   ],
   "source": [
    "solveset(abs(z-2)-2,z,Complexes)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 37,
   "id": "58fc7124",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\left[\\begin{matrix}\\cos{\\left(x \\right)}\\\\\\sin{\\left(x \\right)}\\end{matrix}\\right]$"
      ],
      "text/plain": [
       "Matrix([\n",
       "[cos(x)],\n",
       "[sin(x)]])"
      ]
     },
     "execution_count": 37,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "A=Matrix([cos(x),sin(x)])\n",
    "A"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 38,
   "id": "8e35580e",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\left[\\begin{matrix}- \\cos{\\left(x \\right)}\\\\- \\sin{\\left(x \\right)}\\end{matrix}\\right]$"
      ],
      "text/plain": [
       "Matrix([\n",
       "[-cos(x)],\n",
       "[-sin(x)]])"
      ]
     },
     "execution_count": 38,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "B=-A\n",
    "B"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 42,
   "id": "7bcce076",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\left[\\begin{matrix}\\frac{1}{2}\\\\\\frac{\\sqrt{3}}{2}\\end{matrix}\\right]$"
      ],
      "text/plain": [
       "Matrix([\n",
       "[      1/2],\n",
       "[sqrt(3)/2]])"
      ]
     },
     "execution_count": 42,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "C=Matrix([Rational(1,2),(sqrt(3)/2)])\n",
    "C\n",
    "\n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 46,
   "id": "c9663ad7",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\left[\\begin{matrix}\\frac{1}{2}\\\\- \\frac{\\sqrt{3}}{2}\\end{matrix}\\right]$"
      ],
      "text/plain": [
       "Matrix([\n",
       "[       1/2],\n",
       "[-sqrt(3)/2]])"
      ]
     },
     "execution_count": 46,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "D=Matrix([cos(-pi/3),sin(-pi/3)])\n",
    "D"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 47,
   "id": "8bc179b4",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\left[\\begin{matrix}\\frac{1}{2} - \\cos{\\left(x \\right)}\\\\- \\sin{\\left(x \\right)} + \\frac{\\sqrt{3}}{2}\\end{matrix}\\right]$"
      ],
      "text/plain": [
       "Matrix([\n",
       "[       1/2 - cos(x)],\n",
       "[-sin(x) + sqrt(3)/2]])"
      ]
     },
     "execution_count": 47,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "AC=C-A\n",
    "AC"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 49,
   "id": "5db4093b",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\left[\\begin{matrix}\\cos{\\left(x \\right)} + \\frac{1}{2}\\\\\\sin{\\left(x \\right)} - \\frac{\\sqrt{3}}{2}\\end{matrix}\\right]$"
      ],
      "text/plain": [
       "Matrix([\n",
       "[      cos(x) + 1/2],\n",
       "[sin(x) - sqrt(3)/2]])"
      ]
     },
     "execution_count": 49,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "BD=D-B\n",
    "BD"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 50,
   "id": "4298d11d",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\left[\\begin{matrix}\\left(\\frac{1}{2} - \\cos{\\left(x \\right)}\\right) \\left(\\cos{\\left(x \\right)} + \\frac{1}{2}\\right) + \\left(- \\sin{\\left(x \\right)} + \\frac{\\sqrt{3}}{2}\\right) \\left(\\sin{\\left(x \\right)} - \\frac{\\sqrt{3}}{2}\\right)\\end{matrix}\\right]$"
      ],
      "text/plain": [
       "Matrix([[(1/2 - cos(x))*(cos(x) + 1/2) + (-sin(x) + sqrt(3)/2)*(sin(x) - sqrt(3)/2)]])"
      ]
     },
     "execution_count": 50,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "AC.T*BD"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 51,
   "id": "f867a4a0",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\left[\\begin{matrix}\\sqrt{3} \\sin{\\left(x \\right)} - \\frac{3}{2}\\end{matrix}\\right]$"
      ],
      "text/plain": [
       "Matrix([[sqrt(3)*sin(x) - 3/2]])"
      ]
     },
     "execution_count": 51,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "simplify(AC.T*BD)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 62,
   "id": "6e829631",
   "metadata": {},
   "outputs": [],
   "source": [
    "def line_and_quadratic_function(line,qua,x=x,y=y,first=True):\n",
    "    l_eq=line\n",
    "    e_eq=qua\n",
    "    if(not first):\n",
    "        x,y=y,x\n",
    "        \n",
    "    eq=e_eq.subs(y,list(solveset(l_eq,y))[0])\n",
    "    expr_check=factor(expand(eq))\n",
    "    # print(expr_check)\n",
    "    # print(type(expr_check))\n",
    "    if(type(expr_check)==Mul):\n",
    "        answer=1\n",
    "        for expr in expr_check.args:\n",
    "            if(expr.has(x)):\n",
    "                answer=answer*expr\n",
    "        return collect(answer,x)\n",
    "    if(type(expr_check)==Add):\n",
    "        return collect(expr_check,x)\n",
    "    else:\n",
    "        raise(\"something wrong!\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 63,
   "id": "7e31c2a0",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle k^{2} - 2 k + x^{2} \\left(k^{2} - 2\\right) + x \\left(- 2 k^{2} + 2 k\\right) + 3$"
      ],
      "text/plain": [
       "k**2 - 2*k + x**2*(k**2 - 2) + x*(-2*k**2 + 2*k) + 3"
      ]
     },
     "execution_count": 63,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "line_and_quadratic_function(y-k*(x-1)-1,x**2-y**2/2-1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 64,
   "id": "37b2d929",
   "metadata": {},
   "outputs": [],
   "source": [
    "q=quadratic_function(_)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 70,
   "id": "94203abe",
   "metadata": {},
   "outputs": [],
   "source": [
    "answer=solveset(q.delta>0,k,Reals)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 76,
   "id": "b337c6d5",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\left\\{2\\right\\}$"
      ],
      "text/plain": [
       "{2}"
      ]
     },
     "execution_count": 76,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "solveset(q.symmetry-1,k,Reals)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 71,
   "id": "04db5d9a",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "False"
      ]
     },
     "execution_count": 71,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "k1 in answer"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 72,
   "id": "d041265f",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "True"
      ]
     },
     "execution_count": 72,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "k2 in answer"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 73,
   "id": "2a31b511",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle - \\frac{\\sqrt{17}}{2} - \\frac{1}{2}$"
      ],
      "text/plain": [
       "-sqrt(17)/2 - 1/2"
      ]
     },
     "execution_count": 73,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "k2"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 74,
   "id": "1c7c0e0c",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle - \\frac{2 k \\left(1 - k\\right)}{2 k^{2} - 4}$"
      ],
      "text/plain": [
       "-2*k*(1 - k)/(2*k**2 - 4)"
      ]
     },
     "execution_count": 74,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "q.symmetry"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 78,
   "id": "a617400e",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle 2 x^{2} - 4 x + 3$"
      ],
      "text/plain": [
       "2*x**2 - 4*x + 3"
      ]
     },
     "execution_count": 78,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "q.to_expr().subs(k,2)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 79,
   "id": "8d1f4652",
   "metadata": {},
   "outputs": [],
   "source": [
    "q=line_and_quadratic_function(y-x-1,x**2-y**2/4-1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 82,
   "id": "3bcb22c4",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\left(x + 1\\right) \\left(3 x - 5\\right)$"
      ],
      "text/plain": [
       "(x + 1)*(3*x - 5)"
      ]
     },
     "execution_count": 82,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "q"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 83,
   "id": "b2447104",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle 3 x^{2} - 2 x - 5$"
      ],
      "text/plain": [
       "3*x**2 - 2*x - 5"
      ]
     },
     "execution_count": 83,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "expand(q)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 84,
   "id": "10e75f11",
   "metadata": {},
   "outputs": [],
   "source": [
    "expr=line_and_quadratic_function(y-(x-3)/sqrt(3),x**2/3-y**2/6-1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 85,
   "id": "cef699c8",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\left(x + 3\\right) \\left(5 x - 9\\right)$"
      ],
      "text/plain": [
       "(x + 3)*(5*x - 9)"
      ]
     },
     "execution_count": 85,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "expr"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 86,
   "id": "35891d93",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle 5 x^{2} + 6 x - 27$"
      ],
      "text/plain": [
       "5*x**2 + 6*x - 27"
      ]
     },
     "execution_count": 86,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "expand(expr)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 87,
   "id": "65db231d",
   "metadata": {},
   "outputs": [],
   "source": [
    "x1,x2=solveset(expr,x,Reals)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 88,
   "id": "2bac7d52",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\frac{24}{5}$"
      ],
      "text/plain": [
       "24/5"
      ]
     },
     "execution_count": 88,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "abs(x1-x2)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 89,
   "id": "4a262b72",
   "metadata": {},
   "outputs": [],
   "source": [
    "expr=line_and_quadratic_function(y-k*(x-2),x**2-y**2-2)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 90,
   "id": "d20626ae",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle 4 k^{2} x - 4 k^{2} + x^{2} \\cdot \\left(1 - k^{2}\\right) - 2$"
      ],
      "text/plain": [
       "4*k**2*x - 4*k**2 + x**2*(1 - k**2) - 2"
      ]
     },
     "execution_count": 90,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "expr"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 92,
   "id": "fb52b1ce",
   "metadata": {},
   "outputs": [],
   "source": [
    "expr=line_and_quadratic_function(y-k*x-1,x**2-y**2/4-1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 93,
   "id": "171da55d",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle 2 k x + x^{2} \\left(k^{2} - 4\\right) + 5$"
      ],
      "text/plain": [
       "2*k*x + x**2*(k**2 - 4) + 5"
      ]
     },
     "execution_count": 93,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "expr"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 95,
   "id": "d52bf0d4",
   "metadata": {},
   "outputs": [],
   "source": [
    "q=quadratic_function(expr)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 96,
   "id": "a3bdb9a4",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle 80 - 16 k^{2}$"
      ],
      "text/plain": [
       "80 - 16*k**2"
      ]
     },
     "execution_count": 96,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "q.delta"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 102,
   "id": "60d998a4",
   "metadata": {},
   "outputs": [],
   "source": [
    "x1,x2=solveset(q.to_expr(x),x,Reals).args[1]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 103,
   "id": "6923c59b",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle 4 \\left|{\\frac{\\sqrt{5 - k^{2}}}{k^{2} - 4}}\\right|$"
      ],
      "text/plain": [
       "4*Abs(sqrt(5 - k**2)/(k**2 - 4))"
      ]
     },
     "execution_count": 103,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "abs(x1-x2)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 108,
   "id": "575b8b10",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle - 16 \\left(k^{2} - 3\\right) \\left(2 k^{2} - 9\\right)$"
      ],
      "text/plain": [
       "-16*(k**2 - 3)*(2*k**2 - 9)"
      ]
     },
     "execution_count": 108,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "fraction(factor((x1-x2)**2-32))[0]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 109,
   "id": "91365705",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle - 2 k^{4} + 15 k^{2} - 27$"
      ],
      "text/plain": [
       "-2*k**4 + 15*k**2 - 27"
      ]
     },
     "execution_count": 109,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "expand(_/16)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 110,
   "id": "3cdbc444",
   "metadata": {},
   "outputs": [],
   "source": [
    "expr=line_and_quadratic_function(y-2*(x-3),x**2/8-y**2/4-1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 111,
   "id": "f58fc733",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\left(x - 4\\right) \\left(7 x - 20\\right)$"
      ],
      "text/plain": [
       "(x - 4)*(7*x - 20)"
      ]
     },
     "execution_count": 111,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "expr"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 112,
   "id": "5c6e6b49",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle 7 x^{2} - 48 x + 80$"
      ],
      "text/plain": [
       "7*x**2 - 48*x + 80"
      ]
     },
     "execution_count": 112,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "expand(expr)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 113,
   "id": "672923fd",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle - k \\left(x - 3\\right) + y$"
      ],
      "text/plain": [
       "-k*(x - 3) + y"
      ]
     },
     "execution_count": 113,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "expr_line=y-k*(x-3)\n",
    "expr_line"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 114,
   "id": "5587909c",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle - \\frac{y^{2}}{9 - a^{2}} - 1 + \\frac{x^{2}}{a^{2}}$"
      ],
      "text/plain": [
       "-y**2/(9 - a**2) - 1 + x**2/a**2"
      ]
     },
     "execution_count": 114,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "expr_hyperbola=x**2/a**2-y**2/(9-a**2)-1\n",
    "expr_hyperbola"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 116,
   "id": "94ae9b0f",
   "metadata": {},
   "outputs": [],
   "source": [
    "expr=line_and_quadratic_function(expr_line,expr_hyperbola)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 117,
   "id": "feca6674",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle - a^{4} - 6 a^{2} k^{2} x + 9 a^{2} k^{2} + 9 a^{2} + x^{2} \\left(a^{2} k^{2} + a^{2} - 9\\right)$"
      ],
      "text/plain": [
       "-a**4 - 6*a**2*k**2*x + 9*a**2*k**2 + 9*a**2 + x**2*(a**2*k**2 + a**2 - 9)"
      ]
     },
     "execution_count": 117,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "expr"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 118,
   "id": "310eb0c7",
   "metadata": {},
   "outputs": [],
   "source": [
    "q=quadratic_function(expr)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 119,
   "id": "cbbc1490",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\frac{6 a^{2} k^{2}}{2 a^{2} k^{2} + 2 a^{2} - 18}$"
      ],
      "text/plain": [
       "6*a**2*k**2/(2*a**2*k**2 + 2*a**2 - 18)"
      ]
     },
     "execution_count": 119,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "q.symmetry"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 120,
   "id": "5b1323c5",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle - k \\left(\\frac{6 a^{2} k^{2}}{2 a^{2} k^{2} + 2 a^{2} - 18} - 3\\right) + y$"
      ],
      "text/plain": [
       "-k*(6*a**2*k**2/(2*a**2*k**2 + 2*a**2 - 18) - 3) + y"
      ]
     },
     "execution_count": 120,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "expr_line.subs(x,_)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 121,
   "id": "8fb04f24",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\frac{3 k \\left(9 - a^{2}\\right)}{a^{2} k^{2} + a^{2} - 9}$"
      ],
      "text/plain": [
       "3*k*(9 - a**2)/(a**2*k**2 + a**2 - 9)"
      ]
     },
     "execution_count": 121,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "simplify(-_+y)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 122,
   "id": "be92d716",
   "metadata": {},
   "outputs": [],
   "source": [
    "answer_y=_"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 123,
   "id": "358b63c1",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\frac{3 k \\left(9 - a^{2}\\right)}{a^{2} k^{2} + a^{2} - 9}$"
      ],
      "text/plain": [
       "3*k*(9 - a**2)/(a**2*k**2 + a**2 - 9)"
      ]
     },
     "execution_count": 123,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "answer_y"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 124,
   "id": "427cee09",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\left\\{\\left( 0, \\  -3\\right), \\left( 0, \\  3\\right), \\left( 1, \\  -2\\right), \\left( 1, \\  2\\right)\\right\\}$"
      ],
      "text/plain": [
       "{(0, -3), (0, 3), (1, -2), (1, 2)}"
      ]
     },
     "execution_count": 124,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "nonlinsolve([q.symmetry+12,answer_y+15],[k,a])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 125,
   "id": "a35e5f99",
   "metadata": {},
   "outputs": [],
   "source": [
    "expr=line_and_quadratic_function(x+y-2,3*x**2-y**2-3)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 126,
   "id": "1cf486fd",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle 2 x^{2} + 4 x - 7$"
      ],
      "text/plain": [
       "2*x**2 + 4*x - 7"
      ]
     },
     "execution_count": 126,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "expr"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 127,
   "id": "18e84049",
   "metadata": {},
   "outputs": [],
   "source": [
    "expr=line_and_quadratic_function(y-x+Rational(1,2),x**2-2*y**2-4)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 130,
   "id": "0c5ffe59",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle 2 x^{2} - 4 x + 9$"
      ],
      "text/plain": [
       "2*x**2 - 4*x + 9"
      ]
     },
     "execution_count": 130,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "factor(expr)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 133,
   "id": "14f474ca",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Help on function five_points in module __main__:\n",
      "\n",
      "five_points(A, omega, phi, f='sin')\n",
      "\n"
     ]
    }
   ],
   "source": [
    "help(five_points)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 134,
   "id": "442d37d5",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[(-pi/6, 0), (pi/12, 2), (pi/3, 0), (7*pi/12, -2), (5*pi/6, 0)]"
      ]
     },
     "execution_count": 134,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "five_points(2,2,pi/3)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 135,
   "id": "cfbdc6a1",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[(-pi/6, 0), (pi/12, 4), (pi/3, 0), (7*pi/12, -4), (5*pi/6, 0)]"
      ]
     },
     "execution_count": 135,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "five_points(4,2,pi/3)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 157,
   "id": "decdd8fb",
   "metadata": {},
   "outputs": [],
   "source": [
    "answer=solveset(sin(pi/8*x-5*pi/4)-Rational(1,2),x,Reals)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 158,
   "id": "7b42bfd9",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "sympy.sets.sets.Union"
      ]
     },
     "execution_count": 158,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "type(answer)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 159,
   "id": "e42a2f22",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\left\\{16 n + \\frac{2}{3}\\; \\middle|\\; n \\in \\mathbb{Z}\\right\\}$"
      ],
      "text/plain": [
       "ImageSet(Lambda(_n, 16*_n + 2/3), Integers)"
      ]
     },
     "execution_count": 159,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "simplify(answer.args[0])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 160,
   "id": "22ad6ec3",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\left\\{16 n + \\frac{34}{3}\\; \\middle|\\; n \\in \\mathbb{Z}\\right\\}$"
      ],
      "text/plain": [
       "ImageSet(Lambda(_n, 16*_n + 34/3), Integers)"
      ]
     },
     "execution_count": 160,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "simplify(answer.args[1])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 165,
   "id": "435ea431",
   "metadata": {},
   "outputs": [],
   "source": [
    "c=symbols(\"c\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 166,
   "id": "9dae2548",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle a + b = x \\left(b + c\\right) + y \\left(a - c\\right)$"
      ],
      "text/plain": [
       "Eq(a + b, x*(b + c) + y*(a - c))"
      ]
     },
     "execution_count": 166,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "eq=Eq(a+b,x*(b+c)+y*(a-c))\n",
    "eq"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 170,
   "id": "ac7045b0",
   "metadata": {
    "collapsed": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Help on function collect in module sympy.simplify.radsimp:\n",
      "\n",
      "collect(expr, syms, func=None, evaluate=None, exact=False, distribute_order_term=True)\n",
      "    Collect additive terms of an expression.\n",
      "    \n",
      "    Explanation\n",
      "    ===========\n",
      "    \n",
      "    This function collects additive terms of an expression with respect\n",
      "    to a list of expression up to powers with rational exponents. By the\n",
      "    term symbol here are meant arbitrary expressions, which can contain\n",
      "    powers, products, sums etc. In other words symbol is a pattern which\n",
      "    will be searched for in the expression's terms.\n",
      "    \n",
      "    The input expression is not expanded by :func:`collect`, so user is\n",
      "    expected to provide an expression in an appropriate form. This makes\n",
      "    :func:`collect` more predictable as there is no magic happening behind the\n",
      "    scenes. However, it is important to note, that powers of products are\n",
      "    converted to products of powers using the :func:`~.expand_power_base`\n",
      "    function.\n",
      "    \n",
      "    There are two possible types of output. First, if ``evaluate`` flag is\n",
      "    set, this function will return an expression with collected terms or\n",
      "    else it will return a dictionary with expressions up to rational powers\n",
      "    as keys and collected coefficients as values.\n",
      "    \n",
      "    Examples\n",
      "    ========\n",
      "    \n",
      "    >>> from sympy import S, collect, expand, factor, Wild\n",
      "    >>> from sympy.abc import a, b, c, x, y\n",
      "    \n",
      "    This function can collect symbolic coefficients in polynomials or\n",
      "    rational expressions. It will manage to find all integer or rational\n",
      "    powers of collection variable::\n",
      "    \n",
      "        >>> collect(a*x**2 + b*x**2 + a*x - b*x + c, x)\n",
      "        c + x**2*(a + b) + x*(a - b)\n",
      "    \n",
      "    The same result can be achieved in dictionary form::\n",
      "    \n",
      "        >>> d = collect(a*x**2 + b*x**2 + a*x - b*x + c, x, evaluate=False)\n",
      "        >>> d[x**2]\n",
      "        a + b\n",
      "        >>> d[x]\n",
      "        a - b\n",
      "        >>> d[S.One]\n",
      "        c\n",
      "    \n",
      "    You can also work with multivariate polynomials. However, remember that\n",
      "    this function is greedy so it will care only about a single symbol at time,\n",
      "    in specification order::\n",
      "    \n",
      "        >>> collect(x**2 + y*x**2 + x*y + y + a*y, [x, y])\n",
      "        x**2*(y + 1) + x*y + y*(a + 1)\n",
      "    \n",
      "    Also more complicated expressions can be used as patterns::\n",
      "    \n",
      "        >>> from sympy import sin, log\n",
      "        >>> collect(a*sin(2*x) + b*sin(2*x), sin(2*x))\n",
      "        (a + b)*sin(2*x)\n",
      "    \n",
      "        >>> collect(a*x*log(x) + b*(x*log(x)), x*log(x))\n",
      "        x*(a + b)*log(x)\n",
      "    \n",
      "    You can use wildcards in the pattern::\n",
      "    \n",
      "        >>> w = Wild('w1')\n",
      "        >>> collect(a*x**y - b*x**y, w**y)\n",
      "        x**y*(a - b)\n",
      "    \n",
      "    It is also possible to work with symbolic powers, although it has more\n",
      "    complicated behavior, because in this case power's base and symbolic part\n",
      "    of the exponent are treated as a single symbol::\n",
      "    \n",
      "        >>> collect(a*x**c + b*x**c, x)\n",
      "        a*x**c + b*x**c\n",
      "        >>> collect(a*x**c + b*x**c, x**c)\n",
      "        x**c*(a + b)\n",
      "    \n",
      "    However if you incorporate rationals to the exponents, then you will get\n",
      "    well known behavior::\n",
      "    \n",
      "        >>> collect(a*x**(2*c) + b*x**(2*c), x**c)\n",
      "        x**(2*c)*(a + b)\n",
      "    \n",
      "    Note also that all previously stated facts about :func:`collect` function\n",
      "    apply to the exponential function, so you can get::\n",
      "    \n",
      "        >>> from sympy import exp\n",
      "        >>> collect(a*exp(2*x) + b*exp(2*x), exp(x))\n",
      "        (a + b)*exp(2*x)\n",
      "    \n",
      "    If you are interested only in collecting specific powers of some symbols\n",
      "    then set ``exact`` flag to True::\n",
      "    \n",
      "        >>> collect(a*x**7 + b*x**7, x, exact=True)\n",
      "        a*x**7 + b*x**7\n",
      "        >>> collect(a*x**7 + b*x**7, x**7, exact=True)\n",
      "        x**7*(a + b)\n",
      "    \n",
      "    If you want to collect on any object containing symbols, set\n",
      "    ``exact`` to None:\n",
      "    \n",
      "        >>> collect(x*exp(x) + sin(x)*y + sin(x)*2 + 3*x, x, exact=None)\n",
      "        x*exp(x) + 3*x + (y + 2)*sin(x)\n",
      "        >>> collect(a*x*y + x*y + b*x + x, [x, y], exact=None)\n",
      "        x*y*(a + 1) + x*(b + 1)\n",
      "    \n",
      "    You can also apply this function to differential equations, where\n",
      "    derivatives of arbitrary order can be collected. Note that if you\n",
      "    collect with respect to a function or a derivative of a function, all\n",
      "    derivatives of that function will also be collected. Use\n",
      "    ``exact=True`` to prevent this from happening::\n",
      "    \n",
      "        >>> from sympy import Derivative as D, collect, Function\n",
      "        >>> f = Function('f') (x)\n",
      "    \n",
      "        >>> collect(a*D(f,x) + b*D(f,x), D(f,x))\n",
      "        (a + b)*Derivative(f(x), x)\n",
      "    \n",
      "        >>> collect(a*D(D(f,x),x) + b*D(D(f,x),x), f)\n",
      "        (a + b)*Derivative(f(x), (x, 2))\n",
      "    \n",
      "        >>> collect(a*D(D(f,x),x) + b*D(D(f,x),x), D(f,x), exact=True)\n",
      "        a*Derivative(f(x), (x, 2)) + b*Derivative(f(x), (x, 2))\n",
      "    \n",
      "        >>> collect(a*D(f,x) + b*D(f,x) + a*f + b*f, f)\n",
      "        (a + b)*f(x) + (a + b)*Derivative(f(x), x)\n",
      "    \n",
      "    Or you can even match both derivative order and exponent at the same time::\n",
      "    \n",
      "        >>> collect(a*D(D(f,x),x)**2 + b*D(D(f,x),x)**2, D(f,x))\n",
      "        (a + b)*Derivative(f(x), (x, 2))**2\n",
      "    \n",
      "    Finally, you can apply a function to each of the collected coefficients.\n",
      "    For example you can factorize symbolic coefficients of polynomial::\n",
      "    \n",
      "        >>> f = expand((x + a + 1)**3)\n",
      "    \n",
      "        >>> collect(f, x, factor)\n",
      "        x**3 + 3*x**2*(a + 1) + 3*x*(a + 1)**2 + (a + 1)**3\n",
      "    \n",
      "    .. note:: Arguments are expected to be in expanded form, so you might have\n",
      "              to call :func:`~.expand` prior to calling this function.\n",
      "    \n",
      "    See Also\n",
      "    ========\n",
      "    \n",
      "    collect_const, collect_sqrt, rcollect\n",
      "\n"
     ]
    }
   ],
   "source": [
    "help(collect)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 171,
   "id": "4469716a",
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle a + b - x \\left(b + c\\right) - y \\left(a - c\\right)$"
      ],
      "text/plain": [
       "a + b - x*(b + c) - y*(a - c)"
      ]
     },
     "execution_count": 171,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "expr=eq.lhs-eq.rhs\n",
    "expr"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 175,
   "id": "bc5e4ea9",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle - a y + a - b x + b + c \\left(- x + y\\right)$"
      ],
      "text/plain": [
       "-a*y + a - b*x + b + c*(-x + y)"
      ]
     },
     "execution_count": 175,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "collect(expand(expr),c)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 176,
   "id": "93f8da8b",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\text{True}$"
      ],
      "text/plain": [
       "True"
      ]
     },
     "execution_count": 176,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "cos(23*pi/5)<cos(17*pi/4)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 177,
   "id": "00c73369",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\text{True}$"
      ],
      "text/plain": [
       "True"
      ]
     },
     "execution_count": 177,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "sin(194/180*pi)>cos(160/180*pi)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 178,
   "id": "9a37e79b",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\text{True}$"
      ],
      "text/plain": [
       "True"
      ]
     },
     "execution_count": 178,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "sin(2)>sin(1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 179,
   "id": "94cd6b58",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\text{True}$"
      ],
      "text/plain": [
       "True"
      ]
     },
     "execution_count": 179,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "sin(3)<sin(1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 180,
   "id": "e8a9ed60",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle 2 \\left|{\\cos{\\left(x \\right)}}\\right|$"
      ],
      "text/plain": [
       "2*Abs(cos(x))"
      ]
     },
     "execution_count": 180,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "expr=2*abs(cos(x))\n",
    "expr"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 181,
   "id": "e49ab493",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle 1$"
      ],
      "text/plain": [
       "1"
      ]
     },
     "execution_count": 181,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "expr.subs(x,5*pi/3)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 182,
   "id": "531181e2",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle 1$"
      ],
      "text/plain": [
       "1"
      ]
     },
     "execution_count": 182,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "expr.subs(x,11*pi/3)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 183,
   "id": "96097057",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\frac{2 \\sin{\\left(x \\right)} + 1}{\\sin{\\left(x \\right)} - 2}$"
      ],
      "text/plain": [
       "(2*sin(x) + 1)/(sin(x) - 2)"
      ]
     },
     "execution_count": 183,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "expr=(2*sin(x)+1)/(sin(x)-2)\n",
    "expr"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 185,
   "id": "8b3cb9db",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle 2 + \\frac{5}{\\sin{\\left(x \\right)} - 2}$"
      ],
      "text/plain": [
       "2 + 5/(sin(x) - 2)"
      ]
     },
     "execution_count": 185,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "apart(expr)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 186,
   "id": "b1f86ad5",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\sin{\\left(\\left\\lfloor{\\cos{\\left(x \\right)}}\\right\\rfloor \\right)} + \\cos{\\left(\\left\\lfloor{\\sin{\\left(x \\right)}}\\right\\rfloor \\right)}$"
      ],
      "text/plain": [
       "sin(floor(cos(x))) + cos(floor(sin(x)))"
      ]
     },
     "execution_count": 186,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "expr=sin(floor(cos(x)))+cos(floor(sin((x))))\n",
    "expr"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 187,
   "id": "a9df6241",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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fPhwm8/jmgzUmXPJdRlo/fr1+v73v+/7sN/09PQ2fwp4qV+PnQ651rT65a4hpLi4WEuXLtXy5cvldruVmZmp7OzsFj/4+NixY5o9e7YyMzPldru1bNky3XfffSopKenhyUNPR8/lNw4fPiyPx+Pb4uN79zsCm5qalJSUpDVr1rRrPddkcB09j9/gevRXXl6uJUuWaO/evSorK9O5c+eUlZWlpqamFp/DNRlcZ87lN7guvzV8+HD96le/0r59+7Rv3z796Ec/0k033aSPP/446PpecT12+tvtLwGTJk2yFy9e7Ldv7Nix9sMPP2zbtm3X19f7fWHtP//zP9tjx471W3/PPffYaWlpPTNwCGvrXF5o9+7dtiT79OnTPTCdmSTZpaWlra7hmmxbe85jW9dj3taP7LiH/t0uePvTrh/QICdOnLAl2eXl5S2u4Zpsn/acS/6ebJ/BgwfbL730UtA/6w3XY7fckTPB2bNntX//fmVlZfntz8rKUmVlZdDnVFVVBayfOXOm9u3bp7/97W/dNmuo68y5/EZycrJiY2M1bdo07d69uzvHvCRxTXattq7H9n/q5qWpvr5ekhQV1fJ3T3NNtk97zuU3+HsyuPPnz2vLli1qampSenp60DW94XrstSF38uRJnT9/XtHR0X77o6OjVVdXF/Q5dXV1QdefO3dOJ0+e7LZZQ11nzmVsbKw2bNigkpISbd26VQkJCZo2bZoqKip6YuRLBtdk12jrejTjl0W6l23bys3N1fXXX9/qh75zTbatveeSvyeD+9Of/qTLL79c4eHhWrx4sUpLSzV+/Piga3vD9djhd61eai78fT7btlv9Hb9g64Pt7406ci4TEhKUkJDge5yenq7jx4/r6aef1pQpU7p1zksN1+TF43ps27333quPPvpI7733XptruSZb195zyXUZXEJCgqqrq3XmzBmVlJRo4cKFKi8vbzHmLvXrsdfekRsyZIj69u0bcMfoxIkTAfX+jZiYmKDr+/XrpyuuuKLbZg11nTmXwaSlpenIkSNdPd4ljWuy+3A9fusXv/iFXn/9de3evVvDhw9vdS3XZOs6ci6D4br8+utCv/e97yk1NVX5+flKSkpSQUFB0LW94XrstSEXFhamlJQUlZWV+e0vKytTRkZG0Oekp6cHrN+1a5dSU1PVv3//bps11HXmXAbjdrsVGxvb1eNd0rgmuw/X49d3Lu69915t3bpV77zzjkaOHNnmc7gmg+vMuQyG6zKQbdtqbm4O+me94np06E0WIWHLli12//797Y0bN9oHDx60ly5dal922WX2Z599Ztu2bT/wwAN+71r9y1/+Yn/nO9+xH3jgAfvgwYP2xo0b7f79+9u///3vnTyMkNDWuXz44YftnJwc3/pnn33WLi0ttT/99FP7z3/+s/3www/bkuySkhKnDiEkNDQ02G6323a73bYk+5lnnrHdbrf9+eef27YdeB65JoPr6Hls63pc9j/vWl1V1rvetfrzn//cdrlc9p49e2yPx+Pb/vrXv/rWcE22T2fOJX9PBsrLy7MrKirsY8eO2R999JG9bNkyu0+fPvauXbts2+6d12OvDjnbtu21a9facXFxdlhYmH3ttdf6vRX81ltv9Qs527btPXv22MnJyXZYWJg9YsQIe/369U6MHZJaO5cLFy60b7jhBt/jlStX2qNHj7YjIiLswYMH29dff7395ptvOjB1aPnm4wYu3BYuXGjbduB5tG2uyWA6eh7buh57a8gFO4eS7N/85je+NVyT7dOZc8nfk4HuvPNO3//PDB061J42bZov4my7d16Plm339jfUt8zr9crlcqm+vl6RkZFOjwPAIctL/6TffVCjB6aP0f3Te++HsQIIPb32d+QAAABMR8gBAAAYipADAAAwFCEHAABgKEIOAADAUIQcAACAoQg5AAAAQxFyANBOtvjYTQChhZADgDZYltMTAEBwhBwAAIChCDkAaEFRUZEiIiLU1NTk23fXXXfp+9//vurr6x2cDAC+xnettoLvWgV6N9u29YMf/ECDpt+jz/vH6Qf9arX///yr9u7dq+9+97tOjwcA3JEDgJZYlqUnn3xSnxz8RJK0d+8H+o//+A8iDkDIIOQAoBVz5szR4KjBkqRbbrlFiYmJDk8EAN8i5ACgFTt37tTp02ckSZdffpmzwwDABQg5AGjBH//4R91888364Q03SJLeeecdhycCAH+EHAAE8dlnn+nGG2/Uww8/rDEJYyRJBw8e1P79+x2eDAC+RcgBwAX++7//W9nZ2frxj3+sZcuW+fYnJCRo+fLlDk4GAP76OT0AAISaqKgoffLJJwH7b731Vi2d/rgDEwFAcNyRAwAAMBQhBwAAYChCDgDaie/BARBqCDkAaIMly+kRACAoQg4AAMBQhBwAAIChCDkAAABDEXIAAACGIuQAAAAMRcgBAAAYipADAAAwFCEHAABgKEIOAADAUIQcAACAoQg5AAAAQ4VMyK1bt04jR45URESEUlJS9O6777a49o477pBlWQFbYmKib01hYWHQNV9++WVPHA4AAEC3C4mQKy4u1tKlS7V8+XK53W5lZmYqOztbNTU1QdcXFBTI4/H4tuPHjysqKko333yz37rIyEi/dR6PRxERET1xSAAAAN0uJELumWee0aJFi3TXXXdp3LhxWrVqla666iqtX78+6HqXy6WYmBjftm/fPp0+fVo//elP/dZZluW3LiYmpicOB8AlynZ6AAC4gOMhd/bsWe3fv19ZWVl++7OyslRZWdmu19i4caOmT5+uuLg4v/2NjY2Ki4vT8OHDNWfOHLnd7i6bG0DvYVlOTwAAwfVzeoCTJ0/q/Pnzio6O9tsfHR2turq6Np/v8Xj01ltvafPmzX77x44dq8LCQl1zzTXyer0qKCjQddddpwMHDig+Pj7oazU3N6u5udn32Ov1duKIAAAAeobjd+S+YV3wr7y2bQfsC6awsFCDBg3SvHnz/PanpaXptttuU1JSkjIzM/Xqq69qzJgxeu6551p8rfz8fLlcLt921VVXdepYAAAAeoLjITdkyBD17ds34O7biRMnAu7SXci2bb388svKyclRWFhYq2v79OmjiRMn6siRIy2uycvLU319vW87fvx4+w8EAACghzkecmFhYUpJSVFZWZnf/rKyMmVkZLT63PLych09elSLFi1q859j27aqq6sVGxvb4prw8HBFRkb6bQAAAKHK8d+Rk6Tc3Fzl5OQoNTVV6enp2rBhg2pqarR48WJJX98pq62t1aZNm/yet3HjRk2ePFkTJkwIeM0VK1YoLS1N8fHx8nq9Wr16taqrq7V27doeOSYAAIDuFhIht2DBAp06dUpPPPGEPB6PJkyYoB07dvjeherxeAI+U66+vl4lJSUqKCgI+ppnzpzR3Xffrbq6OrlcLiUnJ6uiokKTJk3q9uMBAADoCZZt23w0Ugu8Xq9cLpfq6+v5MSvQiz22/c/aVPW57psWr9wZY5weBwB8HP8dOQAAAHQOIQcAAGAoQg4AAMBQhBwAAIChCDkAAABDEXIAAACGIuQAoL34tCYAIYaQA4A2WE4PAAAtIOQAAAAMRcgBAAAYipAD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\n",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/plain": [
       "<sympy.plotting.plot.Plot at 0x7f266ab8a340>"
      ]
     },
     "execution_count": 187,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "plot(expr,(x,0,pi))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 188,
   "id": "65f0b8a3",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle - x^{2} + \\sqrt{3} x + \\frac{5}{4}$"
      ],
      "text/plain": [
       "-x**2 + sqrt(3)*x + 5/4"
      ]
     },
     "execution_count": 188,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "expr=-x**2+sqrt(3)*x+Rational(5,4)\n",
    "expr"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 189,
   "id": "b1a8d55e",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\left[\\frac{1}{4} - \\sqrt{3}, 2\\right]$"
      ],
      "text/plain": [
       "Interval(1/4 - sqrt(3), 2)"
      ]
     },
     "execution_count": 189,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "function_range(expr,x,Interval(-1,1))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 190,
   "id": "d91941dc",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle - \\sin{\\left(x \\right)} + \\cos^{2}{\\left(x \\right)}$"
      ],
      "text/plain": [
       "-sin(x) + cos(x)**2"
      ]
     },
     "execution_count": 190,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "expr=cos(x)**2-sin(x)\n",
    "expr"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 193,
   "id": "4d99005a",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle - \\sin^{2}{\\left(x \\right)} - \\sin{\\left(x \\right)} + 1$"
      ],
      "text/plain": [
       "-sin(x)**2 - sin(x) + 1"
      ]
     },
     "execution_count": 193,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "expr.subs(cos(x)**2,1-sin(x)**2)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 195,
   "id": "c052a037",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\left[\\frac{1}{2} - \\frac{\\sqrt{2}}{2}, \\frac{5}{4}\\right]$"
      ],
      "text/plain": [
       "Interval(1/2 - sqrt(2)/2, 5/4)"
      ]
     },
     "execution_count": 195,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "function_range(expr,x,Interval(-pi/4,pi/4))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 198,
   "id": "e10e669a",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\sin{\\left(\\pi x + \\frac{\\pi}{6} \\right)}$"
      ],
      "text/plain": [
       "sin(pi*x + pi/6)"
      ]
     },
     "execution_count": 198,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "expr=cos(pi*x-pi/3)\n",
    "expr"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 199,
   "id": "26a3c195",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/plain": [
       "<sympy.plotting.plot.Plot at 0x7f2669ac6dc0>"
      ]
     },
     "execution_count": 199,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "plot(expr,(x,-pi,pi))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 200,
   "id": "91efe41e",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\sin{\\left(\\frac{x}{2} + \\frac{\\pi}{3} \\right)}$"
      ],
      "text/plain": [
       "sin(x/2 + pi/3)"
      ]
     },
     "execution_count": 200,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "expr=cos(x/2-pi/6)\n",
    "expr"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 201,
   "id": "3f190a5b",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle 0$"
      ],
      "text/plain": [
       "0"
      ]
     },
     "execution_count": 201,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "expr.subs(x,2*pi/3-2*x)-expr.subs(x,2*x)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 202,
   "id": "ab750016",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\cos{\\left(x \\right)}$"
      ],
      "text/plain": [
       "cos(x)"
      ]
     },
     "execution_count": 202,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "expr.subs(x,2*x+pi/3)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 203,
   "id": "d7003d5b",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\cos{\\left(x + \\frac{\\pi}{3} \\right)}$"
      ],
      "text/plain": [
       "cos(x + pi/3)"
      ]
     },
     "execution_count": 203,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "expr.subs(x,-2*x-pi/3)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 204,
   "id": "03a52cb2",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle 2 \\sin^{2}{\\left(x \\right)} - \\sin{\\left(x \\right)} - 1$"
      ],
      "text/plain": [
       "2*sin(x)**2 - sin(x) - 1"
      ]
     },
     "execution_count": 204,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "expr=2*sin(x)**2-sin(x)-1\n",
    "expr"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 209,
   "id": "70f3f634",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\left\\{2 n \\pi + \\frac{\\pi}{2}\\; \\middle|\\; n \\in \\mathbb{Z}\\right\\} \\cup \\left\\{2 n \\pi + \\frac{7 \\pi}{6}\\; \\middle|\\; n \\in \\mathbb{Z}\\right\\} \\cup \\left\\{2 n \\pi + \\frac{11 \\pi}{6}\\; \\middle|\\; n \\in \\mathbb{Z}\\right\\}$"
      ],
      "text/plain": [
       "Union(ImageSet(Lambda(_n, 2*_n*pi + pi/2), Integers), ImageSet(Lambda(_n, 2*_n*pi + 7*pi/6), Integers), ImageSet(Lambda(_n, 2*_n*pi + 11*pi/6), Integers))"
      ]
     },
     "execution_count": 209,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "solveset(expr,x,Reals)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 211,
   "id": "27918e68",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle 1$"
      ],
      "text/plain": [
       "1"
      ]
     },
     "execution_count": 211,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "sin(pi/2)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 213,
   "id": "58432c51",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle - a \\log{\\left(a x \\right)} + a + e^{x + 1}$"
      ],
      "text/plain": [
       "-a*log(a*x) + a + exp(x + 1)"
      ]
     },
     "execution_count": 213,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "expr=exp(x+1)+a-a*ln(a*x)\n",
    "expr"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 214,
   "id": "0c0964d1",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\left\\{x\\; \\middle|\\; x \\in \\left(0, \\infty\\right) \\wedge - a \\log{\\left(a x \\right)} + a + e^{x + 1} > 0 \\right\\}$"
      ],
      "text/plain": [
       "ConditionSet(x, -a*log(a*x) + a + exp(x + 1) > 0, Interval.open(0, oo))"
      ]
     },
     "execution_count": 214,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "solveset(expr>0,x,Interval.Lopen(0,oo))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 215,
   "id": "1491316d",
   "metadata": {},
   "outputs": [],
   "source": [
    "l=Line(Point(5,3),slope=sqrt(3))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 216,
   "id": "55b88250",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle - \\sqrt{3} x + y - 3 + 5 \\sqrt{3}$"
      ],
      "text/plain": [
       "-sqrt(3)*x + y - 3 + 5*sqrt(3)"
      ]
     },
     "execution_count": 216,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "l.equation()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 217,
   "id": "c259f386",
   "metadata": {},
   "outputs": [],
   "source": [
    "A=Point(-1,5)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 218,
   "id": "1e489fe8",
   "metadata": {},
   "outputs": [],
   "source": [
    "B=Point(2,-1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 219,
   "id": "41a136bf",
   "metadata": {},
   "outputs": [],
   "source": [
    "l=Line(A,B)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 221,
   "id": "d11a9aab",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle 3 \\cdot \\left(2 x + y - 3\\right)$"
      ],
      "text/plain": [
       "3*(2*x + y - 3)"
      ]
     },
     "execution_count": 221,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "factor(l.equation())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 222,
   "id": "dad6ab23",
   "metadata": {},
   "outputs": [],
   "source": [
    "l=Line(Point(-3,0),Point(0,-1))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 223,
   "id": "3ac1aac5",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle x + 3 y + 3$"
      ],
      "text/plain": [
       "x + 3*y + 3"
      ]
     },
     "execution_count": 223,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "l.equation()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 224,
   "id": "589a633b",
   "metadata": {},
   "outputs": [],
   "source": [
    "l=Line(y).parallel_line(Point(4,2))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 225,
   "id": "e5dc46b1",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle y - 2$"
      ],
      "text/plain": [
       "y - 2"
      ]
     },
     "execution_count": 225,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "l.equation()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 227,
   "id": "232eef62",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle - \\frac{2 \\sqrt{3} x - 3 y - 9 - 4 \\sqrt{3}}{3}$"
      ],
      "text/plain": [
       "-(2*sqrt(3)*x - 3*y - 9 - 4*sqrt(3))/3"
      ]
     },
     "execution_count": 227,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "factor(Line(Point(2,-3),slope=2*sqrt(3)/3).equation())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 228,
   "id": "3eea0938",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\frac{x}{2} + y + \\frac{1}{2}$"
      ],
      "text/plain": [
       "x/2 + y + 1/2"
      ]
     },
     "execution_count": 228,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "Line(Point(-5,2),slope=-Rational(1,2)).equation()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 229,
   "id": "1d777394",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle - 2 x - 5 y$"
      ],
      "text/plain": [
       "-2*x - 5*y"
      ]
     },
     "execution_count": 229,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "Line(Point(0,0),Point(-5,2)).equation()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 230,
   "id": "b4dad063",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\frac{3 x}{4} + y - 3$"
      ],
      "text/plain": [
       "3*x/4 + y - 3"
      ]
     },
     "execution_count": 230,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "l=Line(3*x+4*y-12)\n",
    "l.equation()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 231,
   "id": "8393b2b5",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/svg+xml": [
       "<svg xmlns=\"http://www.w3.org/2000/svg\"\n",
       "            xmlns:xlink=\"http://www.w3.org/1999/xlink\"\n",
       "            width=\"100.0\" height=\"100.0\" viewBox=\"-1.10000000000000 2.15000000000000 1.20000000000000 0.950000000000000\"\n",
       "            preserveAspectRatio=\"xMinYMin meet\">\n",
       "            <defs>\n",
       "                <marker id=\"markerCircle\" markerWidth=\"8\" markerHeight=\"8\"\n",
       "                    refx=\"5\" refy=\"5\" markerUnits=\"strokeWidth\">\n",
       "                    <circle cx=\"5\" cy=\"5\" r=\"1.5\" style=\"stroke: none; fill:#000000;\"/>\n",
       "                </marker>\n",
       "                <marker id=\"markerArrow\" markerWidth=\"13\" markerHeight=\"13\" refx=\"2\" refy=\"4\"\n",
       "                       orient=\"auto\" markerUnits=\"strokeWidth\">\n",
       "                    <path d=\"M2,2 L2,6 L6,4\" style=\"fill: #000000;\" />\n",
       "                </marker>\n",
       "                <marker id=\"markerReverseArrow\" markerWidth=\"13\" markerHeight=\"13\" refx=\"6\" refy=\"4\"\n",
       "                       orient=\"auto\" markerUnits=\"strokeWidth\">\n",
       "                    <path d=\"M6,2 L6,6 L2,4\" style=\"fill: #000000;\" />\n",
       "                </marker>\n",
       "            </defs><g transform=\"matrix(1,0,0,-1,0,5.25000000000000)\"><path fill-rule=\"evenodd\" fill=\"#66cc99\" stroke=\"#555555\" stroke-width=\"0.0240000000000000\" opacity=\"0.6\" d=\"M -1.00000000000000,3.00000000000000 L 0,2.25000000000000\" marker-start=\"url(#markerReverseArrow)\" marker-end=\"url(#markerArrow)\"/></g></svg>"
      ],
      "text/latex": [
       "$\\displaystyle \\operatorname{Line2D}\\left(\\operatorname{Point2D}\\left(-1, 3\\right), \\operatorname{Point2D}\\left(0, \\frac{9}{4}\\right)\\right)$"
      ],
      "text/plain": [
       "Line2D(Point2D(-1, 3), Point2D(0, 9/4))"
      ]
     },
     "execution_count": 231,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "parallel_line=l.parallel_line(Point(-1,3))\n",
    "parallel_line"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 234,
   "id": "b860610d",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\frac{3 x + 4 y - 9}{4}$"
      ],
      "text/plain": [
       "(3*x + 4*y - 9)/4"
      ]
     },
     "execution_count": 234,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "factor(parallel_line.equation())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 235,
   "id": "b85999ab",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/svg+xml": [
       "<svg xmlns=\"http://www.w3.org/2000/svg\"\n",
       "            xmlns:xlink=\"http://www.w3.org/1999/xlink\"\n",
       "            width=\"100.0\" height=\"100.0\" viewBox=\"-1.10000000000000 2.90000000000000 0.950000000000000 1.20000000000000\"\n",
       "            preserveAspectRatio=\"xMinYMin meet\">\n",
       "            <defs>\n",
       "                <marker id=\"markerCircle\" markerWidth=\"8\" markerHeight=\"8\"\n",
       "                    refx=\"5\" refy=\"5\" markerUnits=\"strokeWidth\">\n",
       "                    <circle cx=\"5\" cy=\"5\" r=\"1.5\" style=\"stroke: none; fill:#000000;\"/>\n",
       "                </marker>\n",
       "                <marker id=\"markerArrow\" markerWidth=\"13\" markerHeight=\"13\" refx=\"2\" refy=\"4\"\n",
       "                       orient=\"auto\" markerUnits=\"strokeWidth\">\n",
       "                    <path d=\"M2,2 L2,6 L6,4\" style=\"fill: #000000;\" />\n",
       "                </marker>\n",
       "                <marker id=\"markerReverseArrow\" markerWidth=\"13\" markerHeight=\"13\" refx=\"6\" refy=\"4\"\n",
       "                       orient=\"auto\" markerUnits=\"strokeWidth\">\n",
       "                    <path d=\"M6,2 L6,6 L2,4\" style=\"fill: #000000;\" />\n",
       "                </marker>\n",
       "            </defs><g transform=\"matrix(1,0,0,-1,0,7.00000000000000)\"><path fill-rule=\"evenodd\" fill=\"#66cc99\" stroke=\"#555555\" stroke-width=\"0.0240000000000000\" opacity=\"0.6\" d=\"M -1.00000000000000,3.00000000000000 L -0.250000000000000,4.00000000000000\" marker-start=\"url(#markerReverseArrow)\" marker-end=\"url(#markerArrow)\"/></g></svg>"
      ],
      "text/latex": [
       "$\\displaystyle \\operatorname{Line2D}\\left(\\operatorname{Point2D}\\left(-1, 3\\right), \\operatorname{Point2D}\\left(- \\frac{1}{4}, 4\\right)\\right)$"
      ],
      "text/plain": [
       "Line2D(Point2D(-1, 3), Point2D(-1/4, 4))"
      ]
     },
     "execution_count": 235,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "perpendicular_line=l.perpendicular_line(Point(-1,3))\n",
    "perpendicular_line"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 236,
   "id": "d2ddeab8",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle - x + \\frac{3 y}{4} - \\frac{13}{4}$"
      ],
      "text/plain": [
       "-x + 3*y/4 - 13/4"
      ]
     },
     "execution_count": 236,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "perpendicular_line.equation()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 238,
   "id": "6bf3bb92",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle - 2 m + x \\left(m^{2} - 2 m - 3\\right) - y \\left(2 m^{2} + m - 1\\right) + 6$"
      ],
      "text/plain": [
       "-2*m + x*(m**2 - 2*m - 3) - y*(2*m**2 + m - 1) + 6"
      ]
     },
     "execution_count": 238,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "expr=(m**2-2*m-3)*x-(2*m**2+m-1)*y+6-2*m\n",
    "expr"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 239,
   "id": "18a34362",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle - 3 m^{2} + 4 m + 15$"
      ],
      "text/plain": [
       "-3*m**2 + 4*m + 15"
      ]
     },
     "execution_count": 239,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "expr.subs([(x,-3),(y,0)])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 240,
   "id": "ebe009ad",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\left\\{- \\frac{5}{3}, 3\\right\\}$"
      ],
      "text/plain": [
       "{-5/3, 3}"
      ]
     },
     "execution_count": 240,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "solveset(_,m,Reals)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 241,
   "id": "9c8d7be3",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\left\\{-2, -1\\right\\}$"
      ],
      "text/plain": [
       "{-2, -1}"
      ]
     },
     "execution_count": 241,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "solveset((m**2-2*m-3)-(2*m**2+m-1),m,Reals)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 242,
   "id": "e18383cd",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle - 2 k + x \\left(k + 1\\right) - y \\left(k - 1\\right)$"
      ],
      "text/plain": [
       "-2*k + x*(k + 1) - y*(k - 1)"
      ]
     },
     "execution_count": 242,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "expr=(k+1)*x-(k-1)*y-2*k\n",
    "expr"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 244,
   "id": "541a50d5",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle k \\left(x - y - 2\\right) + x + y$"
      ],
      "text/plain": [
       "k*(x - y - 2) + x + y"
      ]
     },
     "execution_count": 244,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "collect(expand(expr),k)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 246,
   "id": "09c6f293",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle 2 x + y - 5$"
      ],
      "text/plain": [
       "2*x + y - 5"
      ]
     },
     "execution_count": 246,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "Line(Point(2,1),slope=-2).equation()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 247,
   "id": "02256d21",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle - \\frac{4}{3}$"
      ],
      "text/plain": [
       "-4/3"
      ]
     },
     "execution_count": 247,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "Line(4*x+3*y-5).slope"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 248,
   "id": "3f3abe36",
   "metadata": {},
   "outputs": [],
   "source": [
    "A=Point(2,4)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 249,
   "id": "8ff939bb",
   "metadata": {},
   "outputs": [],
   "source": [
    "B=Point(-1,1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 250,
   "id": "dbb0fd9f",
   "metadata": {},
   "outputs": [],
   "source": [
    "C=Point(9,-3)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 251,
   "id": "1a3e211f",
   "metadata": {},
   "outputs": [],
   "source": [
    "t=Triangle(A,B,C)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 255,
   "id": "7297db8d",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/svg+xml": [
       "<svg xmlns=\"http://www.w3.org/2000/svg\"\n",
       "            xmlns:xlink=\"http://www.w3.org/1999/xlink\"\n",
       "            width=\"100.0\" height=\"100.0\" viewBox=\"1.58000000000000 -0.620000000000000 0.840000000000000 5.04000000000000\"\n",
       "            preserveAspectRatio=\"xMinYMin meet\">\n",
       "            <defs>\n",
       "                <marker id=\"markerCircle\" markerWidth=\"8\" markerHeight=\"8\"\n",
       "                    refx=\"5\" refy=\"5\" markerUnits=\"strokeWidth\">\n",
       "                    <circle cx=\"5\" cy=\"5\" r=\"1.5\" style=\"stroke: none; fill:#000000;\"/>\n",
       "                </marker>\n",
       "                <marker id=\"markerArrow\" markerWidth=\"13\" markerHeight=\"13\" refx=\"2\" refy=\"4\"\n",
       "                       orient=\"auto\" markerUnits=\"strokeWidth\">\n",
       "                    <path d=\"M2,2 L2,6 L6,4\" style=\"fill: #000000;\" />\n",
       "                </marker>\n",
       "                <marker id=\"markerReverseArrow\" markerWidth=\"13\" markerHeight=\"13\" refx=\"6\" refy=\"4\"\n",
       "                       orient=\"auto\" markerUnits=\"strokeWidth\">\n",
       "                    <path d=\"M6,2 L6,6 L2,4\" style=\"fill: #000000;\" />\n",
       "                </marker>\n",
       "            </defs><g transform=\"matrix(1,0,0,-1,0,3.80000000000000)\"><path fill-rule=\"evenodd\" fill=\"#66cc99\" stroke=\"#555555\" stroke-width=\"0.100800000000000\" opacity=\"0.6\" d=\"M 2.00000000000000,4.00000000000000 L 2.00000000000000,-0.200000000000000\" /></g></svg>"
      ],
      "text/latex": [
       "$\\displaystyle \\operatorname{Segment2D}\\left(\\operatorname{Point2D}\\left(2, 4\\right), \\operatorname{Point2D}\\left(2, - \\frac{1}{5}\\right)\\right)$"
      ],
      "text/plain": [
       "Segment2D(Point2D(2, 4), Point2D(2, -1/5))"
      ]
     },
     "execution_count": 255,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "t.bisectors()[A]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 256,
   "id": "cb3487fe",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle x - 2$"
      ],
      "text/plain": [
       "x - 2"
      ]
     },
     "execution_count": 256,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "Line(_).equation()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 259,
   "id": "76be87c3",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\frac{21 \\cdot \\left(5 x - 2 y - 2\\right)}{29}$"
      ],
      "text/plain": [
       "21*(5*x - 2*y - 2)/29"
      ]
     },
     "execution_count": 259,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "factor(Line(t.altitudes[A]).equation())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 264,
   "id": "015648f3",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle 5 x + 2 y - 18$"
      ],
      "text/plain": [
       "5*x + 2*y - 18"
      ]
     },
     "execution_count": 264,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "Line(t.medians[A]).equation()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 266,
   "id": "a42d23e8",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle 3.47297256849784$"
      ],
      "text/plain": [
       "3.47297256849784"
      ]
     },
     "execution_count": 266,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "N(28/sqrt(65))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 267,
   "id": "57c6e4ae",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "144"
      ]
     },
     "execution_count": 267,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "13**2-5**2"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 268,
   "id": "c62772ae",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle 7.14142842854285$"
      ],
      "text/plain": [
       "7.14142842854285"
      ]
     },
     "execution_count": 268,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "N(sqrt(51))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 269,
   "id": "154f5e1e",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle 3.97071421427143$"
      ],
      "text/plain": [
       "3.97071421427143"
      ]
     },
     "execution_count": 269,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "N(sqrt(51)/2+1-0.6)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 272,
   "id": "c561a57b",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\mathbb{R} \\cap \\left\\{20 k, 60 k\\right\\}$"
      ],
      "text/plain": [
       "Intersection({20*k, 60*k}, Reals)"
      ]
     },
     "execution_count": 272,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "solveset((-30*k+x)**2-((x)/2)**2,x,Reals)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 273,
   "id": "83f8bf61",
   "metadata": {},
   "outputs": [],
   "source": [
    "M=Point(0,1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 274,
   "id": "ac4ec9d2",
   "metadata": {},
   "outputs": [],
   "source": [
    "P=Point(a,0)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 278,
   "id": "67bbd1a7",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\frac{a^{2}}{2} - a x + y - \\frac{1}{2}$"
      ],
      "text/plain": [
       "a**2/2 - a*x + y - 1/2"
      ]
     },
     "execution_count": 278,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "Segment(M,P).perpendicular_bisector().equation()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 279,
   "id": "670a6731",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\left\\{\\operatorname{Point2D}\\left(\\frac{a^{2} + 5}{2 \\left(a + 1\\right)}, \\frac{- a^{2} + 6 a + 1}{2 \\left(a + 1\\right)}\\right)\\right\\}$"
      ],
      "text/plain": [
       "{Point2D((a**2 + 5)/(2*(a + 1)), (-a**2 + 6*a + 1)/(2*(a + 1)))}"
      ]
     },
     "execution_count": 279,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "Intersection(Line(x+y-3),Line(_))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 280,
   "id": "05479d50",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\left\\{-1 + \\sqrt{6}, - \\sqrt{6} - 1\\right\\}$"
      ],
      "text/plain": [
       "{-1 + sqrt(6), -sqrt(6) - 1}"
      ]
     },
     "execution_count": 280,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "solveset(list(_)[0].x-a,a,Reals)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 283,
   "id": "cebf4507",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\left\\{40, 250\\right\\}$"
      ],
      "text/plain": [
       "{40, 250}"
      ]
     },
     "execution_count": 283,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "solveset((80-2*(x-250))*x-20000,x,Reals)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 307,
   "id": "9eb8d75b",
   "metadata": {},
   "outputs": [],
   "source": [
    "e=Ellipse(Point(0,0),2,2*sqrt(2))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 308,
   "id": "912e4ac1",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\frac{x^{2}}{4} + \\frac{y^{2}}{8} - 1$"
      ],
      "text/plain": [
       "x**2/4 + y**2/8 - 1"
      ]
     },
     "execution_count": 308,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "e.equation()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 309,
   "id": "1af3fe29",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle 3 x^{2} - 6 x + 1$"
      ],
      "text/plain": [
       "3*x**2 - 6*x + 1"
      ]
     },
     "execution_count": 309,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "line_and_ellipse_quadratic(Line(x+y-3),e)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 287,
   "id": "d3d5931c",
   "metadata": {},
   "outputs": [],
   "source": [
    "A,B=Intersection(Line(x+y-3),e)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 288,
   "id": "dcf134b0",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\frac{4 \\sqrt{3}}{3}$"
      ],
      "text/plain": [
       "4*sqrt(3)/3"
      ]
     },
     "execution_count": 288,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "A.distance(B)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 289,
   "id": "475bf66a",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle -1 + \\frac{y^{2}}{b^{2}} + \\frac{x^{2}}{a^{2}}$"
      ],
      "text/plain": [
       "-1 + y**2/b**2 + x**2/a**2"
      ]
     },
     "execution_count": 289,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "e=Ellipse(Point(0,0),a,b)\n",
    "e.equation()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 291,
   "id": "508fe646",
   "metadata": {},
   "outputs": [],
   "source": [
    "l=Line(x/m+y/n+c)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 300,
   "id": "7964845e",
   "metadata": {},
   "outputs": [],
   "source": [
    "from sympy.abc import theta"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 301,
   "id": "c8e7dea5",
   "metadata": {},
   "outputs": [],
   "source": [
    "l=Line(x*sin(theta)+y*cos(theta)+c)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 302,
   "id": "1fce21fe",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\frac{c}{\\cos{\\left(\\theta \\right)}} + x \\tan{\\left(\\theta \\right)} + y$"
      ],
      "text/plain": [
       "c/cos(theta) + x*tan(theta) + y"
      ]
     },
     "execution_count": 302,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "l.equation()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 303,
   "id": "799aea7d",
   "metadata": {},
   "outputs": [],
   "source": [
    "A,B=Intersection(l,e)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 304,
   "id": "5b593c63",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\operatorname{Point2D}\\left(\\frac{a \\left(- a c \\sin{\\left(\\theta \\right)} + b \\sqrt{- a^{2} \\cos^{2}{\\left(\\theta \\right)} + a^{2} + b^{2} \\cos^{2}{\\left(\\theta \\right)} - c^{2}} \\cos{\\left(\\theta \\right)}\\right)}{a^{2} \\sin^{2}{\\left(\\theta \\right)} + b^{2} \\cos^{2}{\\left(\\theta \\right)}}, - \\frac{b \\left(a \\sqrt{a^{2} \\sin^{2}{\\left(\\theta \\right)} - b^{2} \\sin^{2}{\\left(\\theta \\right)} + b^{2} - c^{2}} \\sin{\\left(\\theta \\right)} + b c \\cos{\\left(\\theta \\right)}\\right)}{\\left(a^{2} \\tan^{2}{\\left(\\theta \\right)} + b^{2}\\right) \\cos^{2}{\\left(\\theta \\right)}}\\right)$"
      ],
      "text/plain": [
       "Point2D(a*(-a*c*sin(theta) + b*sqrt(-a**2*cos(theta)**2 + a**2 + b**2*cos(theta)**2 - c**2)*cos(theta))/(a**2*sin(theta)**2 + b**2*cos(theta)**2), -b*(a*sqrt(a**2*sin(theta)**2 - b**2*sin(theta)**2 + b**2 - c**2)*sin(theta) + b*c*cos(theta))/((a**2*tan(theta)**2 + b**2)*cos(theta)**2))"
      ]
     },
     "execution_count": 304,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "simplify(A)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 305,
   "id": "85be71de",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\operatorname{Point2D}\\left(- \\frac{a \\left(a c \\sin{\\left(\\theta \\right)} + b \\sqrt{- a^{2} \\cos^{2}{\\left(\\theta \\right)} + a^{2} + b^{2} \\cos^{2}{\\left(\\theta \\right)} - c^{2}} \\cos{\\left(\\theta \\right)}\\right)}{a^{2} \\sin^{2}{\\left(\\theta \\right)} + b^{2} \\cos^{2}{\\left(\\theta \\right)}}, \\frac{b \\left(a \\sqrt{a^{2} \\sin^{2}{\\left(\\theta \\right)} - b^{2} \\sin^{2}{\\left(\\theta \\right)} + b^{2} - c^{2}} \\sin{\\left(\\theta \\right)} - b c \\cos{\\left(\\theta \\right)}\\right)}{\\left(a^{2} \\tan^{2}{\\left(\\theta \\right)} + b^{2}\\right) \\cos^{2}{\\left(\\theta \\right)}}\\right)$"
      ],
      "text/plain": [
       "Point2D(-a*(a*c*sin(theta) + b*sqrt(-a**2*cos(theta)**2 + a**2 + b**2*cos(theta)**2 - c**2)*cos(theta))/(a**2*sin(theta)**2 + b**2*cos(theta)**2), b*(a*sqrt(a**2*sin(theta)**2 - b**2*sin(theta)**2 + b**2 - c**2)*sin(theta) - b*c*cos(theta))/((a**2*tan(theta)**2 + b**2)*cos(theta)**2))"
      ]
     },
     "execution_count": 305,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "simplify(B)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 306,
   "id": "6d614709",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle 2 \\sqrt{\\frac{a^{2} b^{2} \\left(- a^{2} + \\frac{a^{2}}{\\cos^{2}{\\left(\\theta \\right)}} + b^{2} - \\frac{c^{2}}{\\cos^{2}{\\left(\\theta \\right)}}\\right)}{\\left(a^{2} \\tan^{2}{\\left(\\theta \\right)} + b^{2}\\right)^{2} \\cos^{2}{\\left(\\theta \\right)}}}$"
      ],
      "text/plain": [
       "2*sqrt(a**2*b**2*(-a**2 + a**2/cos(theta)**2 + b**2 - c**2/cos(theta)**2)/((a**2*tan(theta)**2 + b**2)**2*cos(theta)**2))"
      ]
     },
     "execution_count": 306,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "simplify(A.distance(B))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 312,
   "id": "d70ce391",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Help on function line_and_quadratic_function in module __main__:\n",
      "\n",
      "line_and_quadratic_function(line, qua, x=x, y=y, first=True)\n",
      "\n"
     ]
    }
   ],
   "source": [
    "help(line_and_quadratic_function)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 314,
   "id": "5e1a97b1",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle - 4 m y + 8 m + y^{2} - 12$"
      ],
      "text/plain": [
       "-4*m*y + 8*m + y**2 - 12"
      ]
     },
     "execution_count": 314,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "line_and_quadratic_function(x-m*(y-2)-3,y**2-4*x,first=False)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 340,
   "id": "b6a6361d",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle 8 m + \\frac{\\left(8 m - 12\\right)^{2}}{16} - 12$"
      ],
      "text/plain": [
       "8*m + (8*m - 12)**2/16 - 12"
      ]
     },
     "execution_count": 340,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "(8*m-12)**2/16+(8*m-12)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 341,
   "id": "52991608",
   "metadata": {},
   "outputs": [],
   "source": [
    "expr=expand(_)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 343,
   "id": "a631e0e1",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "?\n"
     ]
    }
   ],
   "source": [
    "q=quadratic_function(expr,x=m)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 344,
   "id": "4a918680",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle 4 \\left(x - \\frac{1}{2}\\right)^{2} - 4$"
      ],
      "text/plain": [
       "4*(x - 1/2)**2 - 4"
      ]
     },
     "execution_count": 344,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "q.to_symmetry_expr()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 346,
   "id": "4bbacb68",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle -4$"
      ],
      "text/plain": [
       "-4"
      ]
     },
     "execution_count": 346,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "q.extreme_value"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 349,
   "id": "b3fcac62",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "x\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "<quadratic_function.base.quadratic_function at 0x7f2650bc2ee0>"
      ]
     },
     "execution_count": 349,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "quadratic_function(4*y+3)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 353,
   "id": "42868d45",
   "metadata": {},
   "outputs": [],
   "source": [
    "from sympy.geometry.util import find"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 354,
   "id": "fef1e4e2",
   "metadata": {},
   "outputs": [],
   "source": [
    "def find_answer(x,expr):\n",
    "    try:\n",
    "        return find(x,expr)\n",
    "    except ValueError:\n",
    "        return x"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 358,
   "id": "3c5c4528",
   "metadata": {},
   "outputs": [],
   "source": [
    "p=Parabola(Point(2,0),Line(x+2))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 359,
   "id": "d1ee0ee1",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\operatorname{Parabola}\\left(\\operatorname{Point2D}\\left(2, 0\\right), \\operatorname{Line2D}\\left(\\operatorname{Point2D}\\left(-2, 0\\right), \\operatorname{Point2D}\\left(-2, 1\\right)\\right)\\right)$"
      ],
      "text/plain": [
       "Parabola(Point2D(2, 0), Line2D(Point2D(-2, 0), Point2D(-2, 1)))"
      ]
     },
     "execution_count": 359,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "p"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 360,
   "id": "3e339e6d",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle 8 x - y^{2}$"
      ],
      "text/plain": [
       "8*x - y**2"
      ]
     },
     "execution_count": 360,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "p.equation()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 361,
   "id": "f2e87f40",
   "metadata": {},
   "outputs": [],
   "source": [
    "l=Line(Point(2,0),slope=1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 362,
   "id": "44cd37eb",
   "metadata": {},
   "outputs": [],
   "source": [
    "A,B=Intersection(l,p)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 365,
   "id": "3a6703ff",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle - 8 \\sqrt{2} \\left(x + y - 10\\right)$"
      ],
      "text/plain": [
       "-8*sqrt(2)*(x + y - 10)"
      ]
     },
     "execution_count": 365,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "factor(Segment(A,B).perpendicular_bisector().equation())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 369,
   "id": "102eeb89",
   "metadata": {},
   "outputs": [],
   "source": [
    "O=Point(0,0)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 370,
   "id": "74c0af1d",
   "metadata": {},
   "outputs": [],
   "source": [
    "e=Ellipse(O,2,sqrt(6))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 371,
   "id": "d467ec48",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\frac{x^{2}}{4} + \\frac{y^{2}}{6} - 1$"
      ],
      "text/plain": [
       "x**2/4 + y**2/6 - 1"
      ]
     },
     "execution_count": 371,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "e.equation()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 373,
   "id": "4a48c3b1",
   "metadata": {},
   "outputs": [],
   "source": [
    "from sympy.abc import t"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 377,
   "id": "164ec783",
   "metadata": {},
   "outputs": [],
   "source": [
    "expr=line_and_ellipse_quadratic(Line(x-t*y-1),e,first=False)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 382,
   "id": "530f6003",
   "metadata": {},
   "outputs": [],
   "source": [
    "y1,y2=solveset(expr,y,Reals).args[1]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 386,
   "id": "0a525cd9",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle 6 \\sqrt{2} \\sqrt{\\frac{2 t^{2} + 1}{9 t^{4} + 12 t^{2} + 4}}$"
      ],
      "text/plain": [
       "6*sqrt(2)*sqrt((2*t**2 + 1)/(9*t**4 + 12*t**2 + 4))"
      ]
     },
     "execution_count": 386,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "sqrt(simplify((y1+y2)**2-4*y1*y2))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 387,
   "id": "1c233316",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle 6 \\sqrt{2} \\sqrt{\\frac{2 t^{2} + 1}{9 t^{4} + 12 t^{2} + 4}} \\sqrt{t^{2} + 1}$"
      ],
      "text/plain": [
       "6*sqrt(2)*sqrt((2*t**2 + 1)/(9*t**4 + 12*t**2 + 4))*sqrt(t**2 + 1)"
      ]
     },
     "execution_count": 387,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "expr=_*sqrt(1+t**2)\n",
    "expr"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 388,
   "id": "2504d591",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\left\\{0\\right\\}$"
      ],
      "text/plain": [
       "{0}"
      ]
     },
     "execution_count": 388,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "solveset(expr-3*sqrt(2),t,Reals)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 389,
   "id": "5cc830ea",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/svg+xml": [
       "<svg xmlns=\"http://www.w3.org/2000/svg\"\n",
       "            xmlns:xlink=\"http://www.w3.org/1999/xlink\"\n",
       "            width=\"100.0\" height=\"100.0\" viewBox=\"-12.0000000000000 -7.00000000000000 24.0000000000000 14.0000000000000\"\n",
       "            preserveAspectRatio=\"xMinYMin meet\">\n",
       "            <defs>\n",
       "                <marker id=\"markerCircle\" markerWidth=\"8\" markerHeight=\"8\"\n",
       "                    refx=\"5\" refy=\"5\" markerUnits=\"strokeWidth\">\n",
       "                    <circle cx=\"5\" cy=\"5\" r=\"1.5\" style=\"stroke: none; fill:#000000;\"/>\n",
       "                </marker>\n",
       "                <marker id=\"markerArrow\" markerWidth=\"13\" markerHeight=\"13\" refx=\"2\" refy=\"4\"\n",
       "                       orient=\"auto\" markerUnits=\"strokeWidth\">\n",
       "                    <path d=\"M2,2 L2,6 L6,4\" style=\"fill: #000000;\" />\n",
       "                </marker>\n",
       "                <marker id=\"markerReverseArrow\" markerWidth=\"13\" markerHeight=\"13\" refx=\"6\" refy=\"4\"\n",
       "                       orient=\"auto\" markerUnits=\"strokeWidth\">\n",
       "                    <path d=\"M6,2 L6,6 L2,4\" style=\"fill: #000000;\" />\n",
       "                </marker>\n",
       "            </defs><g transform=\"matrix(1,0,0,-1,0,0)\"><ellipse fill=\"#66cc99\" stroke=\"#555555\" stroke-width=\"0.480000000000000\" opacity=\"0.6\" cx=\"0\" cy=\"0\" rx=\"10.0000000000000\" ry=\"5.00000000000000\"/></g></svg>"
      ],
      "text/latex": [
       "$\\displaystyle \\operatorname{Ellipse}\\left(\\operatorname{Point2D}\\left(0, 0\\right), 10, 5\\right)$"
      ],
      "text/plain": [
       "Ellipse(Point2D(0, 0), 10, 5)"
      ]
     },
     "execution_count": 389,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "e=Ellipse(O,10,5)\n",
    "e"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 390,
   "id": "2a2d8552",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/svg+xml": [
       "<svg xmlns=\"http://www.w3.org/2000/svg\"\n",
       "            xmlns:xlink=\"http://www.w3.org/1999/xlink\"\n",
       "            width=\"100.0\" height=\"100.0\" viewBox=\"1.20000000000000 -4.80000000000000 9.60000000000000 9.60000000000000\"\n",
       "            preserveAspectRatio=\"xMinYMin meet\">\n",
       "            <defs>\n",
       "                <marker id=\"markerCircle\" markerWidth=\"8\" markerHeight=\"8\"\n",
       "                    refx=\"5\" refy=\"5\" markerUnits=\"strokeWidth\">\n",
       "                    <circle cx=\"5\" cy=\"5\" r=\"1.5\" style=\"stroke: none; fill:#000000;\"/>\n",
       "                </marker>\n",
       "                <marker id=\"markerArrow\" markerWidth=\"13\" markerHeight=\"13\" refx=\"2\" refy=\"4\"\n",
       "                       orient=\"auto\" markerUnits=\"strokeWidth\">\n",
       "                    <path d=\"M2,2 L2,6 L6,4\" style=\"fill: #000000;\" />\n",
       "                </marker>\n",
       "                <marker id=\"markerReverseArrow\" markerWidth=\"13\" markerHeight=\"13\" refx=\"6\" refy=\"4\"\n",
       "                       orient=\"auto\" markerUnits=\"strokeWidth\">\n",
       "                    <path d=\"M6,2 L6,6 L2,4\" style=\"fill: #000000;\" />\n",
       "                </marker>\n",
       "            </defs><g transform=\"matrix(1,0,0,-1,0,0)\"><ellipse fill=\"#66cc99\" stroke=\"#555555\" stroke-width=\"0.192000000000000\" opacity=\"0.6\" cx=\"6.00000000000000\" cy=\"0\" rx=\"4.00000000000000\" ry=\"4.00000000000000\"/></g></svg>"
      ],
      "text/latex": [
       "$\\displaystyle \\operatorname{Circle}\\left(\\operatorname{Point2D}\\left(6, 0\\right), 4\\right)$"
      ],
      "text/plain": [
       "Circle(Point2D(6, 0), 4)"
      ]
     },
     "execution_count": 390,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "c=Circle(Point(6,0),4)\n",
    "c"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 391,
   "id": "fcc360dd",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\left\\{\\operatorname{Point2D}\\left(6, -4\\right), \\operatorname{Point2D}\\left(6, 4\\right), \\operatorname{Point2D}\\left(10, 0\\right)\\right\\}$"
      ],
      "text/plain": [
       "{Point2D(6, -4), Point2D(6, 4), Point2D(10, 0)}"
      ]
     },
     "execution_count": 391,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "Intersection(c,e)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 395,
   "id": "71bef0fa",
   "metadata": {},
   "outputs": [],
   "source": [
    "h=Hyperbola(O,vradius=sqrt(3),eccentricity=2)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 396,
   "id": "c26eeedd",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle x^{2} - \\frac{y^{2}}{3} - 1$"
      ],
      "text/plain": [
       "x**2 - y**2/3 - 1"
      ]
     },
     "execution_count": 396,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "h.equation()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 405,
   "id": "306cca27",
   "metadata": {},
   "outputs": [],
   "source": [
    "h=Hyperbola(Point(0,1),real=1,eccentricity=2,_slope=oo)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 406,
   "id": "754f27e6",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle x^{2} - \\frac{y^{2}}{3} + \\frac{2 y}{3} - \\frac{4}{3}$"
      ],
      "text/plain": [
       "x**2 - y**2/3 + 2*y/3 - 4/3"
      ]
     },
     "execution_count": 406,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "expand(h.equation())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 415,
   "id": "c2e98a10",
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle 2 k x + x^{2} \\left(k^{2} - 3\\right) + 4$"
      ],
      "text/plain": [
       "2*k*x + x**2*(k**2 - 3) + 4"
      ]
     },
     "execution_count": 415,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "line_and_quadratic_function(y-k*x-1,x**2-y**2/3-1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 416,
   "id": "d47cea69",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "x\n"
     ]
    }
   ],
   "source": [
    "q=quadratic_function(_)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 417,
   "id": "6e0b982f",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle 48 - 12 k^{2}$"
      ],
      "text/plain": [
       "48 - 12*k**2"
      ]
     },
     "execution_count": 417,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "q.delta"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 428,
   "id": "dd4c3f34",
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle - \\frac{k}{k^{2} - 3} - \\frac{\\sqrt{3} \\sqrt{- \\left(k - 2\\right) \\left(k + 2\\right)}}{k^{2} - 3}$"
      ],
      "text/plain": [
       "-k/(k**2 - 3) - sqrt(3)*sqrt(-(k - 2)*(k + 2))/(k**2 - 3)"
      ]
     },
     "execution_count": 428,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "list(solveset(q.to_expr(x),x,Reals).args[1])[1]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 429,
   "id": "97a30480",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\left[-2, - \\sqrt{3}\\right) \\cup \\left(- \\sqrt{3}, -1\\right) \\cup \\left(-1, \\sqrt{3}\\right)$"
      ],
      "text/plain": [
       "Union(Interval.Ropen(-2, -sqrt(3)), Interval.open(-1, sqrt(3)), Interval.open(-sqrt(3), -1))"
      ]
     },
     "execution_count": 429,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "solveset(_>1,k,Reals)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 430,
   "id": "9ae3ca75",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\frac{x^{2}}{2} + y^{2} - 1$"
      ],
      "text/plain": [
       "x**2/2 + y**2 - 1"
      ]
     },
     "execution_count": 430,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "e=Ellipse(O,sqrt(2),1)\n",
    "e.equation()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 431,
   "id": "522604eb",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle - x + y + 1$"
      ],
      "text/plain": [
       "-x + y + 1"
      ]
     },
     "execution_count": 431,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "l=Line(y-(x-1))\n",
    "l.equation()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 440,
   "id": "7cac2fc0",
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\left(y + 1\\right) \\left(3 y - 1\\right)$"
      ],
      "text/plain": [
       "(y + 1)*(3*y - 1)"
      ]
     },
     "execution_count": 440,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "line_and_ellipse_quadratic(l,e,first=False)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 441,
   "id": "37a11bd3",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle - k x + k + y$"
      ],
      "text/plain": [
       "-k*x + k + y"
      ]
     },
     "execution_count": 441,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "l=Line(y-k*(x-1))\n",
    "l.equation()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 442,
   "id": "4dc8f1c7",
   "metadata": {},
   "outputs": [],
   "source": [
    "P,Q=Intersection(e,l)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 443,
   "id": "b8968287",
   "metadata": {},
   "outputs": [],
   "source": [
    "t=Triangle(O,P,Q)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 444,
   "id": "54a0ab8c",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle - \\frac{k \\sqrt{2 k^{2} + 2}}{2 k^{2} + 1}$"
      ],
      "text/plain": [
       "-k*sqrt(2*k**2 + 2)/(2*k**2 + 1)"
      ]
     },
     "execution_count": 444,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "t.area"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 445,
   "id": "97e68b85",
   "metadata": {},
   "outputs": [],
   "source": [
    "l1=Segment(P,Q).perpendicular_bisector()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 446,
   "id": "6f24afbe",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\frac{2 \\sqrt{2} \\sqrt{k^{2} + 1} \\cdot \\left(2 k^{3} y + 2 k^{2} x - k^{2} + k y + x\\right)}{\\left(2 k^{2} + 1\\right)^{2}}$"
      ],
      "text/plain": [
       "2*sqrt(2)*sqrt(k**2 + 1)*(2*k**3*y + 2*k**2*x - k**2 + k*y + x)/(2*k**2 + 1)**2"
      ]
     },
     "execution_count": 446,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "factor(l1.equation())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 449,
   "id": "52af1aff",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\mathbb{R} \\cap \\left\\{\\frac{k^{2}}{2 k^{2} + 1}\\right\\}$"
      ],
      "text/plain": [
       "Intersection({k**2/(2*k**2 + 1)}, Reals)"
      ]
     },
     "execution_count": 449,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "solveset(factor(l1.equation(x,y)).subs(y,0),x,Reals)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 450,
   "id": "683a3e9b",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle - 4 k^{2} x + 2 k^{2} + x^{2} \\cdot \\left(2 k^{2} + 1\\right) - 2$"
      ],
      "text/plain": [
       "-4*k**2*x + 2*k**2 + x**2*(2*k**2 + 1) - 2"
      ]
     },
     "execution_count": 450,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "line_and_ellipse_quadratic(l,e)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 451,
   "id": "69523467",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle y = 9 x - 90$"
      ],
      "text/plain": [
       "Eq(y, 9*x - 90)"
      ]
     },
     "execution_count": 451,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "eq=Eq(y,12*3+6*6+(x-18)*9)\n",
    "eq"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 452,
   "id": "6977001a",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle 2 \\sin{\\left(x \\right)} \\sin{\\left(x + \\frac{\\pi}{6} \\right)}$"
      ],
      "text/plain": [
       "2*sin(x)*sin(x + pi/6)"
      ]
     },
     "execution_count": 452,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "expr=2*sin(x)*cos(x-pi/3)\n",
    "expr"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 453,
   "id": "8b0e159e",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle 2 \\left(\\frac{\\sqrt{3} \\sin{\\left(x \\right)}}{2} + \\frac{\\cos{\\left(x \\right)}}{2}\\right) \\sin{\\left(x \\right)}$"
      ],
      "text/plain": [
       "2*(sqrt(3)*sin(x)/2 + cos(x)/2)*sin(x)"
      ]
     },
     "execution_count": 453,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "expand_trig(expr)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 454,
   "id": "d56c17b5",
   "metadata": {},
   "outputs": [],
   "source": [
    "expr_f=simplify(_)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 455,
   "id": "91759f37",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle - \\cos{\\left(2 x + \\frac{\\pi}{6} \\right)} + \\frac{\\sqrt{3}}{2}$"
      ],
      "text/plain": [
       "-cos(2*x + pi/6) + sqrt(3)/2"
      ]
     },
     "execution_count": 455,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "expr_f"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 458,
   "id": "bcd7515b",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[(-pi/6, 0), (pi/12, 2), (pi/3, 0), (7*pi/12, -2), (5*pi/6, 0)]"
      ]
     },
     "execution_count": 458,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "five_points(2,2,pi/3)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 462,
   "id": "b3a779f4",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle 2 \\sin{\\left(2 x + \\frac{\\pi}{3} \\right)}$"
      ],
      "text/plain": [
       "2*sin(2*x + pi/3)"
      ]
     },
     "execution_count": 462,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "expr=2*sin(2*x+pi/3)\n",
    "expr"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 473,
   "id": "62fca000",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[Interval.open(pi/12, 7*pi/12), Interval.open(13*pi/12, 19*pi/12)]"
      ]
     },
     "execution_count": 473,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "function_monotonyset(expr,x,Interval(0,pi*2))[\"-\"]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 474,
   "id": "2cc9e397",
   "metadata": {
    "collapsed": true
   },
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAnYAAAHWCAYAAAD6oMSKAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/bCgiHAAAACXBIWXMAAA9hAAAPYQGoP6dpAABY9ElEQVR4nO3dd3gUdeLH8femJ5AsJaQSCD2QUEKQdiIg0gVERCyH+LuDE+sheipyCCiKvffDrmcFrICiFFGKlAQIEGogIRBCCGwSkmzKzu+PaE6kSEkyWz6v59nnMbMz2c+ayebDzHy/YzEMw0BEREREXJ6X2QFEREREpHqo2ImIiIi4CRU7ERERETehYiciIiLiJlTsRERERNyEip2IiIiIm1CxExEREXETKnYiIiIibkLFTkREROQcGIZBfn4+zniPBxU7ERERkXNQUFCA1WqloKDA7CgnUbETERERcRMqdiIiIiJuQsVORERExE2o2ImIiIi4CRU7ERERETehYiciIiLiJlTsRERERNyEip2IiIiIm1CxExEREXETKnYiIiIibkLFTkRERMRNqNiJiIiIuAkVOxERERE3oWInIiIi4iZU7ERERETchIqdiIiIiJtQsRMRERFxEyp2IiIiIm5CxU5ERETkHPy0KxeA4tIKk5OcTMVORERE5Cx9vDaDWz/YAMBbP6ebnOZkPmYHEBEREXF2hmHw1Hc7eHHpLhwOA4DxvZqbnOpkOmInIiIicgal5Q4mf7KRF5fuAuCmSyoLnZ+P89UoHbETEREROQ1bURk3vb+O1Xvy8PayMHtkewa1sfJvs4OdhoqdiIiIyCnsP1rEjW+tZVdOIXX9fXj5+s5c0roR+fn5Zkc7LRU7ERERkT/YvN/G395Zy+ECOxEhAbx540W0iwoxO9afUrETERER+Z2laTnc+t8NFJVWEBcRzFv/dxGR1kCzY50VFTsRERGRX32RksXkTzZS4TDo1SqUl67vTEiAr9mxzpqKnYiIiAjw4S8Z3D9/M4YBVyZG89hVHfD1dr6Rr2eiYiciIiIe742f0nno660A/LV7Ex4cnoCXl8XkVOdOxU5EREQ82otLdvLkdzsA+MclzZkyOA6LxfVKHajYiYiIiIcyDIMnvt3Oy8t2A3DnZa25o19Lly11oGInIiIiHsjhMHjw6628vXIvAFOHtGXCJc53i7BzpWInIiIiHqXCYXD/vM18vC4TgFlXJPDX7k1NTlU9VOxERETEYzgcBvd8tom5G/bjZYEnrurIqKTGZseqNip2IiIi4hEMw2Dq56nM3bAfby8LL1ybyJD2kWbHqlauNTmLiIiIyHkwDIOZX23lw18y8LLAM2M6uV2pAxU7ERERcXOGYfDoorSqgRKPX9WR4R2jzA1VQ1TsRERExK09+/1OXlu+B4CHRyZwlRtdU/dHKnYiIiLitl5ZtpvnftgJwAOXt+P6bu4x+vV0VOxERETELb35UzqPLUoD4J5Bbfjbxc1MTlTzVOxERETEZf34448MGzaMqKgoLBYLn3/+OQAfrNnHg7/e+/Wf/VpxS5+WACxbtgyLxXLSIy0tzay3UK003YmIiIi4rOPHj9OxY0f+7//+j1GjRgHw2fr9TJ2fCsBNvZsz6bJWJ223fft2QkJCqr5u1KhR7QSuYSp2IiIi4rIGDx7M4MGDq77enGfhrTUbAbixZyz3DYo75b1fw8LCqFevXm3FrDU6FSsiIiJuwT86jnd3euMw4OoujZk+rN0pSx1AYmIikZGR9OvXj6VLl9Zy0pqjI3YiIiLi8nblFNJo1AOUGRb6xYXxyMj2pyx1kZGRvP766yQlJWG323nvvffo168fy5Yt45JLLjnl97bb7djt9qqv8/Pza+x9XCiLYRiG2SFEREREzteh/BKufHklWceKaVrXwcJ7BhPkd/bHroYNG4bFYuHLL7885fMzZsxg5syZJy232WwnXKfnDHQqVkRERFxWfkkZ4978haxjxZTlZTGhTcU5lTqA7t27s3PnztM+P2XKFGw2W9UjMzPzQmPXGBU7ERERcUn28gomvreetOwCQuv6k/PJA9T1Pffvk5ycTGTk6e8b6+/vT0hIyAkPZ6Vr7ERERMTlOBwGd3+6iZW7jxDgY+H+v4Qwatoh0tPTSUlJoUGDBjRp0oQpU6aQlZXFu+++C8Czzz5LbGws8fHxlJaW8v777zN37lzmzp1r8juqHip2IiIi4nJmL9zGVxsP4G2BfR9MZdTDKQBMnjwZgHHjxvH2229z8OBBMjIyqrYrLS3l7rvvJisri8DAQOLj4/nmm28YMmSIGW+j2mnwhIiIiLiUOSv2MOubbQA8M6YjIxMb1+rr5+fnY7VaNXhCRERE5EJ8ufFAVam7b3BcrZc6Z6diJyIiIi5hzZ4j3PVJClB5V4mbLmlubiAnpGInIiIiTi/jSBET319PWYXB4IQIpl1++rtKeDIVOxEREXFqBSVl/P2dtRwtKqNDYytPX90Jby+VulNRsRMRERGnVeEwuOPDZHbmFBIe4s9/buhCoJ+32bGcloqdiIiIOK3ZC7axdPthAny9+M8NXQgPCTA7klNTsRMRERGn9PHaDOb8lA7Ak6M70qFxPXMDuQAVOxEREXE6a/Yc4d+fpwIw6bJWXN4hyuRErkHFTkRERJzK70fADu0QyT/7tTI7kstQsRMRERGn8ccRsE9e1VHTmpwDFTsRERFxChoBe+FU7ERERMQpaATshVOxExEREdPNXb9fI2CrgYqdiIiImGrLARv3z98MwB39NAL2QqjYiYiIiGmOFZUy8f312Msd9G3TiEkaAXtBVOxERETEFA6HwaSPU8jMKyamQSDPjOmEl+4Be0FU7ERERMQUz/2wk2XbD+Pv48Wrf02iXpCf2ZFcnoqdiIiI1LolaYd47oedADwysj3xUVaTE7kHFTsRERGpVfuOHGfSRykAjO3elFFJjc0N5EZU7ERERKTWFJdWMPH9DeSXlJPYpB7TLm9ndiS3omInIiIitcIwDKbO38y2g/mE1vXj5es74+ejKlKd9H9TREREasX7q/cxLzkLby8LL1zbmUhroNmR3I6KnYiIiNS49fuO8uDXWwG4b1AcPVo0NDmRe1KxExERkRp1uMDOLR+sp6zCYGj7SMb3amZ2JLelYiciIiI1psJhcMeHyRzKt9MyrC6PXdUBi0WTENcUFTsRERGpMS8s2cmqPUcI8vPm1b8mUdffx+xIbk3FTkRERGrEyt25J0xC3DKsrsmJ3J+KnYiIiFS73EI7kz5KwTDg6i6NuSIx2uxIHkHFTkRERKqVw2Ew+ZON5BTYaRVWlxnD482O5DFU7ERERKRavfbjHn7ccZgAXy9eur4zQX66rq62qNiJiIhItVm/L48nv9sOwMzh8bQODzY5kWdRsRMREZFqcayolNv/m0yFw2BEpyiu7hJjdiSPo2InIiIiF8wwDO7+dBMHbCXENgzi4ZHtNV+dCVTsRERE5IK99fNevt92CD9vL168rrPmqzOJip2IiIhckI2Zx5i9cBsA/768LQnRVpMTeS4VOxERETlv+SVl3PbhBsoqDAbFRzC2e1OzI3k0FTsRERE5L4ZhcP+8zWTmFdO4fqDuA+sEVOxERETkvMzdkMXXmw7i7WXh+WsTsQb6mh3J46nYiYiIyDnbd+Q4079IBeDOy1rRuUl9kxMJqNiJiIjIOSqrcPDPj1I4XlpB19gG3NynpdmR5FcqdiIiInJOXliyi5TMYwQH+PD0mI54e+m6OmehYiciIiJnbe3ePF5cshOAh0e2p3H9IJMTye+p2ImIiMhZyS8pY9JHKTgMuDIxmuEdo8yOJH+gYiciIiJn5YHPU8k6VkxMg0Bmjog3O46cgoqdiIiI/KnPk7P4POUA3l4Wnh2TSHCAc0xt8uOPPzJs2DCioqKwWCx8/vnnf7rN8uXLSUpKIiAggObNm/Pqq6/WfNBaomInIiIiZ5SZV8S0zyunNrn90pYkNXWeqU2OHz9Ox44defHFF89q/fT0dIYMGUKvXr1ITk7m/vvv54477mDu3Lk1nLR26A69IiIiclrlFQ7u/DiFAns5SU3rc1tf55raZPDgwQwePPis13/11Vdp0qQJzz77LABt27Zl3bp1PPnkk4waNaqGUtYeHbETERGR03rtxz2s23eUuv4+PDumEz7erl0dVq1axYABA05YNnDgQNatW0dZWZlJqaqPjtiJiIjIKaVm2Xhm8Q4AZg6PJ6aB609tkp2dTXh4+AnLwsPDKS8vJzc3l8jIyJO2sdvt2O32qq/z8/NrPOf5cu3aLSIiIjWipKyCuz7ZSLnDYFB8BFd2jjY7UrWxWE6cUNkwjFMu/83s2bOxWq1Vj5iYmBrPeL5U7EREROQkzyzewfZDBYTW9ePhkQmnLT2uJiIiguzs7BOW5eTk4OPjQ8OGDU+5zZQpU7DZbFWPzMzM2oh6XnQqVkRERE7wS3oer6/YA8DsKzvQsK6/yYmqT48ePfjqq69OWPbdd9/RpUsXfH1PPYWLv78//v6u8f9AR+xERESkSqG9nLs+TcEw4OoujenfLvzPNzJRYWEhKSkppKSkAJXTmaSkpJCRkQFUHm274YYbqtafOHEi+/btY/LkyWzbto0333yTN954g7vvvtuM+NVOR+xERESkyqyvt5KZV0zj+oFMu7yd2XH+1Lp16+jbt2/V15MnTwZg3LhxvP322xw8eLCq5AE0a9aMBQsWcOedd/LSSy8RFRXF888/7xZTnQBYjN+uGBQRERGP9sO2Q/z9nXVYLPDhhO50b37qa848XX5+PlarFZvNRkhIiNlxTqBTsSIiIkLe8VLunbsZgPEXN1Opc1EqdiIiIh7OMAymzt9MbqGdVmF1uWtAG7MjyXlSsRMREfFwX6QcYGFqNj5eFp4Z04kAX2+zI8l5UrETERHxYAdtxUz7IhWAf/ZrRUK01eREciFU7ERERDyUYRjcN3czBSXldIypx819WpgdSS6Qip2IiIiH+nTdfpbvOIyfjxdPje6Ij7dqgavTT1BERMQDHbQV89DXWwG4q39rWobVNTmRVAcVOxEREQ9TdQrWXk5ik3qM79Xc7EhSTVTsREREPMzvT8E+cVVHvL0sZkeSaqJiJyIi4kEOHPvfKdi7B+gUrLtRsRMREfEQhmFw37z/nYL9+8U6BetuVOxEREQ8xCfrMvlRp2DdmoqdiIiIBzhwrJhZX28DdArWnanYiYiIuLnfn4LtrFOwbk3FTkRExM39dgrW38eLJ0brFKw7U7ETERFxYwdtvz8F24YWjXQK1p2p2ImIiLgpwzCYOj+1ahTs3y5uZnYkqWEqdiIiIm7qi5QDLEnLwc/biyeu6qBTsB5AxU5ERMQN5RbamfnVFgDu6NeSlmHBJieS2qBiJyIi4oZmfLmFo0VltI0M4abeLcyOI7VExU5ERMTNfLclm683HcTby8ITV3XA11t/7j2FftIiIiJuxFZcxrQvUgGY0Ks5CdFWkxNJbVKxExERcSOzF2zjUL6d5qF1mHRZK7PjSC1TsRMREXETP+/K5aO1mQA8OqoDAb7eJieS2qZiJyIi4gaKSsu5b94mAG7o0ZSuzRqYnEjMoGInIiLiBp76bgeZecVEWQO4Z1Cc2XHEJCp2IiIiLm5DxlHe/DkdgEeubE9dfx+TE4lZVOxERERcmL28gns/24RhwJWdo+nTJszsSGIiFTsREREX9uqyPezMKSS0rh/ThrYzO46YTMVORETERe3KKeClpbsAmD4snvp1/ExOJGZTsRMREXFBDofBlHmbKa1w0LdNIy7vEGl2JHECKnYiIiIu6MO1Gazde5QgP29mjWyPxWIxO5I4ARU7ERERF3Mov4RHF6QBcPeANkTXCzQ5kTgLFTsREREXM+PLLRTYy+nY2Mq4nrFmxxEnomInIiLiQr7bks3C1Gy8vSzMvrID3l46BSv/o2InIiLiIgpKynjgiy0A/OOS5rSLCjE5kTgbFTsREREX8fii7WTnlxDbMIh/9mtldhxxQip2IiIiLmD9vjzeX7MPgEdGtifA19vkROKMVOxEREScXGm5g/vmbsYwYHRSY3q2DDU7kjgpFTsREREn9+ry3ezMKaRhHT/uH9LW7DjixFTsREREnNiunEJeXFJ527AHhrXTbcPkjFTsREREnJRhGNw/v/K2YX3aNGJ4xyizI4mTU7ETERFxUp+u388v6XkE+nrz0IgE3TZM/pSKnYiIiBM6UmjnkQXbALizfytiGgSZnEhcgYqdiIiIE3p4wTaOFZXRNjKE//tLM7PjOLWXX36ZZs2aERAQQFJSEitWrDjtusuWLcNisZz0SEtLq8XENUfFTkRExMn8vCuXeRuysFjgkZEJ+Hrrz/XpfPzxx0yaNImpU6eSnJxMr169GDx4MBkZGWfcbvv27Rw8eLDq0aqVe0z4rD1FRETEiZSUVTB1/mYAxnZvSmKT+iYncm5PP/00f//73xk/fjxt27bl2WefJSYmhldeeeWM24WFhREREVH18PZ2jwmfVexEREScyMtLd7H3SBFhwf7cPbCN2XGcWmlpKevXr2fAgAEnLB8wYAArV64847aJiYlERkbSr18/li5dWpMxa5WP2QFERESk0q6cAl5ZvhuAGcPjCQnwNTmRc8vNzaWiooLw8PATloeHh5OdnX3KbSIjI3n99ddJSkrCbrfz3nvv0a9fP5YtW8Yll1xyym3sdjt2u73q6/z8/Op7E9VMxU5ERMQJOBwG989LpazCoF9cGIMTIsyO5DL+OA2MYRinnRqmTZs2tGnzvyOhPXr0IDMzkyeffPK0xW727NnMnDmz+gLXIJ2KFRERcQKfrd/PL3sr56ybOSJec9adhdDQULy9vU86OpeTk3PSUbwz6d69Ozt37jzt81OmTMFms1U9MjMzzztzTVOxExERMdmRQjuPLPzfnHWN62vOurPh5+dHUlISixcvPmH54sWL6dmz51l/n+TkZCIjI0/7vL+/PyEhISc8nJVOxYqIiJhs9sI0jhWVERcRrDnrztHkyZMZO3YsXbp0oUePHrz++utkZGQwceJEoPJoW1ZWFu+++y4Azz77LLGxscTHx1NaWsr777/P3LlzmTt3rplvo9qo2ImIiJho9Z4jfLZ+PxYLPDyyveasO0djxozhyJEjPPjggxw8eJCEhAQWLFhA06ZNATh48OAJc9qVlpZy9913k5WVRWBgIPHx8XzzzTcMGTLErLdQrSyGYRhmhxAREfFEpeUOhjy/gl05hVzXrQmPjGxvdiQ5C/n5+VitVmw2m9OdltU/C0REREzynxV72JVTSMM6ftw7MM7sOOIGVOxERERMkHGkiOd/qByJ+e/L22IN0px1cuFU7ERERGqZYRhM+yIVe7mDni0ackWnaLMjiZtQsRMREallCzZns3zHYfy8vXjoigTNWSfVRsVORESkFhWUlDHzqy0ATOzTghaN6pqcSNyJip2IiEgteuq7HeQU2GnaMIhb+rQwO464GRU7ERGRWpKaZePdVXsBmHVFAgG+3uYGErejYiciIlILKhwGU+dvxmHAsI5R9GrVyOxI4oZU7ERERGrBf3/JYON+G3X9fZg2tK3ZccRNqdiJiIjUsMMFdh5flAbAXQNaExYSYHIicVcqdiIiIjVs9oJtFJSUEx8VwtjuTc2OI25MxU5ERKQGrd5zhHnJWVgslQMmfLz1p1dqjvYuERGRGlJa7uDfn6cCcG3XJiQ2qW9yInF3KnYiIiI1ZM5Pe9iVU0jDOn7cOzDO7DjiAVTsREREasD+o0U8/8NOAO4f0hZrkK/JicQTqNiJiIjUgBlfbqWkzEHXZg24snO02XHEQ6jYiYiIVLPFWw/x/bZD+HhZmHVFAhaLxexI4iFU7ERERKpRUWk5M77cAsD4Xs1pHR5sciLxJCp2IiIi1eiFJbvIOlZMdL1A7ujX0uw44mFU7ERERKrJrpwC/vPjHgCmD2tHkJ+PyYnE06jYiYiIVAPDMJj2+RbKHQb94sIYEB9hdiTxQCp2IiIi1eDLjQdYtecI/j5ezBgeb3Yc8VAqdiIiIhcov6SMWd9sA+C2vi2JaRBkciLxVCp2IiIiF+iZxTs4XGCnWWgd/tG7udlxxIOp2ImIiFyALQdsvLNyLwAPjojH38fb3EDi0VTsREREzpPDYTDt81QcBgztEEmvVo3MjiQeTsVORETkPH26PpMNGceo4+fNtKHtzI4jomInIiJyPo4eL+XRhWkA3Nm/NRHWAJMTiajYiYiInJfHv03jaFEZbcKDGdcz1uw4IoCKnYiIyDlLzjjKR2szAZg1MgFfb/05FeegPVFEROQcVDgMpn2RimHAqM6NuSi2gdmRRKqo2ImIiJyDD9bsIzUrn5AAH6YMiTM7jsgJVOxERETO0uECO098ux2Afw1sQ2hdf5MTiZxIxU5EROQszV64jYKSctpHW7muW1Oz44icRMVORETkLPySnse8DVlYLPDQFQl4e1nMjiRyEhU7ERGRP1FW4WDa56kAXHNRDJ1i6pkbSOQ0VOxERET+xDsr97L9UAH1g3y5Z6AGTIjzUrETERE5g2xbCc8s3gHAvYPiqF/Hz+REIqenYiciInIGs77ZyvHSChKb1OPqLjFmxxE5IxU7ERGR0/h5Vy5fbzqIlwUeGpGAlwZMiJNTsRMRETmF0nIH076oHDAxtntTEqKtJicS+XMqdiIiIqcw56c97Dl8nNC6fkwe0MbsOCJnRcVORETkD7KOFfPCD7sAmDK4LdZAX5MTiZwdFTsREZE/eOirrRSXVdA1tgFXdo42O47IWVOxExER+Z1l23NYtCUbby8LD14Rj8WiARPO7uWXX6ZZs2YEBASQlJTEihUrzrj+8uXLSUpKIiAggObNm/Pqq6/WUtKap2InIiLyq5KyCqZ/uQWAG3vGEhcRYnIi+TMff/wxkyZNYurUqSQnJ9OrVy8GDx5MRkbGKddPT09nyJAh9OrVi+TkZO6//37uuOMO5s6dW8vJa4bFMAzD7BB/5HAYGKD78ImISK16/oedPL14B2HB/vxwV2+CA3RtnbPr1q0bnTt35pVXXqla1rZtW6644gpmz5590vr33nsvX375Jdu2bataNnHiRDZu3MiqVavO6jXz8/OxWq3YbDZCQpyr/PuczUqGYVBQUFDTWQDYnp3PrK+30a9tGDf+pVmtvKaIiMj+vCKeX7QJR7mDycNaYpQWk19abHYsOYPS0lLWrVvHHXfcQX5+ftXy3r178+OPP56w7DcrVqygd+/eJzzXq1cv5syZw5EjR/D1PbnM2+127HZ71de/daJTff+aFBwc/KeXBpzVEbvfmqmIiIiImONsjhCeVbGrzSN2DofB2DfWsHG/jYHx4Tx1dacaeZ38/HxiYmLIzMx0usOoUvu0P8jvaX/wPEvTcrj9w2R8vS18dnMPWjQKPuF57RPO6eDBg8TFxbF48WK6du1atfyJJ57go48+Yv369Sdtk5iYyF//+lfuuuuuqmWrV69m4MCB7Nixg/Dw8JO2+eMRu4MHD9K1a1e2bt1KdHTtjZo+myN2Z3Uq1mKx1OqO/Oi13Rj2wk8s3lXApkOlXNwqtMZeKyQkRL+kUkX7g/ye9gfPUFJWwRNLM/DyD2JC7xYktjj9H2rtE84lICAAb29vCgoKTvi55OfnExUVdcqfVXR0NMeOHTvhuePHj+Pj40NsbOwpT8WeTnBwsNPtD045KjY+ysoNPWIBeOCLVOzlFeYGEhERt/Xy0l3sP1pMpDWA2y9taXYcOQd+fn4kJSWxePHiE5YvXryYnj17nnKbHj16nLT+d999R5cuXc6p1Dkrpyx2AJMHtCa0rj97co8zZ0W62XFERMQNpece59XlewB44PJ21PE/qxNZcgplZWVkZmayfft28vLyau11J0+ezJw5c3jzzTfZtm0bd955JxkZGUycOBGAKVOmcMMNN1StP3HiRPbt28fkyZPZtm0bb775Jm+88QZ33313rWWuSU5b7EICfJk6NA6AF5bsZP/Romr9/v7+/kyfPh1/f/9q/b7imrQ/yO9pf/AMhmEw/cstlFY46NUqlEEJEaddV/vEqRUWFvLaa6/Rp08frFYrsbGxtGvXjkaNGtG0aVMmTJjA2rVrazTDmDFjePbZZ3nwwQfp1KkTP/74IwsWLKBp06ZA5fVwv5/TrlmzZixYsIBly5bRqVMnHnroIZ5//nlGjRp11q/5237gjPuDU85j9xvDMBjz+mp+Sc9jQLtwXr+hi9mRRETETSxKPcjE9zfg5+3Ft3deQrPQOmZHcinPPPMMDz/8MLGxsQwfPpyuXbsSHR1NYGAgeXl5pKamsmLFCubPn0/37t154YUXaNWqldmxq4Uzz2Pn1MUOYHt2AUOeX0GFw+CtGy+ib1yY2ZFERMTFFZWWc9lTyzlgK+H2S1ty14A2ZkdyOaNHj+aBBx6gffv2Z1zPbrfzxhtv4Ofnx/jx42spXc1SsbtAD3+zlf+sSKdpwyC+nXQJAb7eZkcSEREX9ujCNF5dvpvG9QNZfGdvAv30d+VCFBQUEBwc/OcruglnLnZOe43d7/3zstaEh/iz70gRry7fbXYcERFxYbtyCpizonLAxIxh8Sp11aBXr15kZ2ebHUNwkWJX19+HaZe3A+DlZbvZd+S4yYlERMQVGYbBA19sodxh0C8ujMvanTwZrZy7Ll260K1bN9LS0k5YnpyczJAhQ0xK5ZlcotgBDG0fycUtQyktdzDjyy2cyxnkvXv38ve//51mzZoRGBhIixYtmD59OqWlpWfczjAMZsyYQVRUFIGBgfTp04ctW7Zc6FsRJ/Hwww/Ts2dPgoKCqFev3lltc+ONN2KxWE54dO/evWaDSq04n/1BnxGu56tNB1m5+wj+Pl7MGB5/xnWPHj3K2LFjsVqtWK1Wxo4dy7Fjx864jad+RsyZM4e//e1vXHzxxfz000/s2LGDq6++mi5dujjlyNGz8fLLL9OsWTMCAgJISkpixYoVZ1x/+fLlJCUlERAQQPPmzXn11VdrKemJXKbYWSwWZo6Ix9fbwtLth1m89dBZb5uWlobD4eC1115jy5YtPPPMM7z66qvcf//9Z9zu8ccf5+mnn+bFF19k7dq1RERE0L9//1q7vZrUrNLSUkaPHs3NN998TtsNGjSIgwcPVj0WLFhQQwmlNp3P/qDPCNdSUFLGrK+3AnBr35bENAg64/rXXXcdKSkpLFq0iEWLFpGSksLYsWP/9HU89TNi+vTp3HXXXfTv35+EhASKi4tZu3Yt8+fPNzvaOfv444+ZNGkSU6dOJTk5mV69ejF48OATpk35vfT0dIYMGUKvXr1ITk7m/vvv54477mDu3Lm1nBwwXMxjC7cZTe/92ug5+wejyF5+3t/n8ccfN5o1a3ba5x0OhxEREWE8+uijVctKSkoMq9VqvPrqq+f9uuJ83nrrLcNqtZ7VuuPGjTNGjBhRo3nEXGe7P+gzwvU8+NUWo+m9Xxu9H19iFJee+e/H1q1bDcBYvXp11bJVq1YZgJGWlnba7Tz1M+LAgQPG7bffbgQGBhqdO3c2goKCjPfff9/sWOeta9euxsSJE09YFhcXZ9x3332GYRiGzWYzAMNmsxmGYRj33HOPERcXd8L6N910k9G9e/faCfw7LnPE7je3XdqS6HqBZB0r5qWlu877+9hsNho0aHDa59PT08nOzmbAgAFVy/z9/enduzcrV64879cV17ds2TLCwsJo3bo1EyZMICcnx+xIYgJ9RriWtOx83l65F4AZw+P/dHaFVatWYbVa6datW9Wy7t27Y7Va//Tn64mfEc2bN2fFihV8+umnrF+/nnnz5nHLLbfw2GOPmR3tnJWWlrJ+/foTfrcBBgwYcNqf/apVq05af+DAgaxbt46ysrIay3oqLlfsgvz+N5Di9R/3sOdw4Tl/j927d/PCCy9U3W7kVH4b3RMefuKFteHh4Rr548EGDx7MBx98wJIlS3jqqadYu3Ytl156KXa73exoUsv0GeE6DMNg2uepVDgMBsVH0KfNn8+Hmp2dTVjYyeuFhYWd8efrqZ8Rb731FsnJyQwdOhSoLDVLly7lueee45ZbbjE53bnJzc2loqLinH63s7OzT7l+eXk5ubm5NZb1VFyu2AEMjA+nT5tGlFY46HH7syddqPr7x7p1607Y9sCBAwwaNIjRo0ef1USJFovlhK8NwzhpmTiPGTNmnHF/ONU+cS7GjBnD0KFDSUhIYNiwYSxcuJAdO3bwzTffVOO7kOpS0/sD6DPCFczbkMXavUcJ9PUmeNe3Z71PnOrn+Gc/X0/9jLjmmmtOWta5c2dWrlzJsmXLaj9QNTjX3+1TrX+q5TXNJe92bLFYmDk8nv5PL4fYRF5bsJZLmtU95bqxsbFV/33gwAH69u1Ljx49eP3118/4GhERlfcMzM7OJjIysmp5Tk7OSa1cnMdtt912yg+Y3/v9PnGhIiMjadq0KTt37qy27ynVpyb3B31GuAZbcRmzF24D4I5+rRid0IW/X3vlGbeJjY1l06ZNHDp08iC9w4cPn9PP19M/I2JjY/n555/NjnFOQkND8fb2Puno3Jl+tyMiIk65vo+PDw0bNqyxrKfiksUOoGnDOtzStyXPfr+TN5KPcd2lnajrf/q3k5WVRd++fUlKSuKtt97Cy+vMByubNWtGREQEixcvJjExEag87758+XKXvGbAU4SGhhIaGlprr3fkyBEyMzNP+MMuzqMm9wd9RriGp77bTm5hKS0a1eHvFzfDz8frrPaJHj16YLPZ+OWXX+jatSsAa9aswWaz0bNnz7N+fXf+jMjIyKBJkyZ/ul79+vWByr/D0dHRNR3rgvn5+ZGUlMTixYsZOXJk1fLFixczYsSIU27To0cPvvrqqxOWfffdd3Tp0gVfX98azXuSWh+uUY2KS8uNSx5fYjS992vjoa+2nHa9rKwso2XLlsall15q7N+/3zh48GDV4/fatGljzJs3r+rrRx991LBarca8efOMzZs3G9dee60RGRlp5Ofn19h7ktqzb98+Izk52Zg5c6ZRt25dIzk52UhOTjYKCgqq1vn9PlFQUGDcddddxsqVK4309HRj6dKlRo8ePYzo6GjtE27gXPcHw9BnhLPblHnMiL3va6PpvV8bP+88fM7bDxo0yOjQoYOxatUqY9WqVUb79u2Nyy+//IR1PPkzIiwszBg/fryxZs2a065z7Ngx4/XXXzfi4+ON559/vhbTXZiPPvrI8PX1Nd544w1j69atxqRJk4w6deoYe/fuNQzDMO68884TRsXu2bPHCAoKMu68805j69atxhtvvGH4+voan332Wa1nd+liZxiGsSTtkNH03q+N5lO+MbYdtJ1ynbfeessATvn4PcB46623qr52OBzG9OnTjYiICMPf39+45JJLjM2bN9fk25FaNG7cuFPuE0uXLq1a5/f7RFFRkTFgwACjUaNGhq+vr9GkSRNj3LhxRkZGhjlvQKrVue4PhqHPCGdWXuEwhr+wwmh679fGHR9uOK/vceTIEeP66683goODjeDgYOP66683jh49esI6nvwZMWHCBGPy5MlG/fr1jbCwMGPIkCHG+PHjjdtuu824/vrrjcTERMPPz8/o2bOnsWDBArPjnrOXXnrJaNq0qeHn52d07tzZWL58edVz11577QnFzjAMY9myZVXvOTY21njllVfMiG1YDOMcbuHgpG5+fz0LU7Pp0rQ+n9zUAy8vXbgsIuLJPlizj6nzUwn29+GHu3oTFhJgdiS34+fnR2ZmJiEhIYSHh3P11Vdz5MgRiouLCQ0NJTExkYEDB5KQkGB21GqXn5+P1WrFZrMREhJidpwTuOw1dr837fJ2LN9xmHX7jjJ3w35Gd4kxO5KIiJjkSKGdxxdtB2DygNYqdTUkOjqa5ORkBg0aRGFhIY888sgpp4iR2uWS0538UVS9QP7ZrxUAsxemcazozPeAFRER9/XowjRsxWW0iwxhbPemZsdxW3fffTfDhw+nZ8+eWCwWPvjgA9auXUtxcbHZ0TyaWxQ7gL9d3IxWYXXJO17K499uNzuOiIiYYN3ePD5dvx+Ah65IwMfbbf7MOZ1bb72V5ORkLr/8cgzD4KWXXqJHjx6EhITQtm1brrnmGh599FEWLlxodlSP4hbX2P1mzZ4jjHl9NRYLzL/lL3SKqWd2JBERqSXlFQ4uf+En0rILGNMlhseu6mB2JI/RsmVLVq9eTZ06ddi0aRMpKSlVj9TUVAoKCsyOWK2c+Ro7typ2AJM/TmFechYJ0SF8cevFeGsghYiIR5izYg+zvtlGvSBfltzVhwZ1/MyOJLjn3Vicudi53THqKUPaEhzgQ2pWPh+s2Wd2HBERqQXZthKeWbwDgPsGxanUORF3K3XOzu2KXaNgf+4Z2AaAJ77dzuEC977xsoiIwKxvtnK8tILEJvW4WjMjiAdzu2IHcF23prSPtlJQUs7sBdvMjiMiIjXop525fL3pIF4WeGhEguYyFY/mlsXO28vCrCsSsFhgXnIWq/ccMTuSiIjUAHt5BQ98kQrADT1iSYi2mpxIxFxuWewAOsbU47qulTcnnvZ5KmUVDpMTiYhIdXtt+R725B6nUbA/kwe0NjuOiOncttgB3DMwjoZ1/NiZU8ibP6WbHUdERKrRviPHeXHpLgD+PbQtIQG+JicSMZ9bFztrkC9ThrQF4Nnvd3LgmGbDFvEkH374IQEBAWRlZVUtGz9+PB06dMBms5mYTC6UYRg88MUWSssd/KVlQ4Z3jDI7kohTcOtiBzCqczQXxdanuKyCmV9tMTuOiNSia665hjZt2jB79mwAZs6cybfffsvChQuxWnUtlitblJrN8h2H8fP24qERCZpSQ+RXPmYHqGkWi4WHrkhg6PM/8e2WQyxJO8SlceFmxxKRWmCxWHj44Ye56qqriIqK4rnnnmPFihVER0ebHU0uQKG9nJlfbQVgYu/mNG9U1+REIs7D7Y/YAcRFhDD+4mYAPPDFFopLK0xOJCK15fLLL6ddu3bMnDmT+fPnEx8fb3YkuUDPLt5Bdn4JTRoEcUvflmbHEXEqHlHsAO7o14ooawD7jxbzwpKdZscRkVry7bffkpaWRkVFBeHhOlrv6rYdzOetlXsBmDkingBfb3MDiTgZjyl2dfx9mDG88l/q/1mxh52H3OuGxCJysg0bNjB69Ghee+01Bg4cyLRp08yOJBfA4TCYOn8zFQ6DwQkR9G0TZnYkEafjMcUOYEB8BJe1DaOswuDfn6diGIbZkUSkhuzdu5ehQ4dy3333MXbsWB588EHmzp3L+vXrzY4m5+nT9ZlsyDhGHT9vHhjWzuw4Ik7Jo4odwIzh8QT6erMmPY95G7L+fAMRcTl5eXkMHjyY4cOHc//99wOQlJTEsGHDmDp1qsnp5HzkHS9l9sI0AO7s35pIa6DJiUSck8XwwMNWryzbzWOL0mhQx48ld/WmXpCf2ZFEROQM7vlsI5+s209cRDBf334xPt4ed1xCnEh+fj5WqxWbzUZISIjZcU7gkb8Z43s1o3V4XfKOl/LYou1mxxERkTNYuzePT9btB2DWFQkqdSJn4JG/Hb7eXsy6oj0AH/6Swfp9R01OJCIip1Ja7mDq/M0AXHNRDF1iG5icSMS5eWSxA+jarAGjkxoDMHX+ZsorHCYnEhGRP5rz0x52HCqkQR0/7hscZ3YcEafnscUOYMqQttQL8iUtu4C3f50XSUREnENmXhHP/1A57+jUIW11PbTIWfDoYtegjh9Tfv0X4NOLd3DgWLHJiUREBMAwDKZ9kUpJmYMezRtyZWfdBk7kbHh0sQMYnRRDUtP6FJVW8OCv9x4UERFzLUzNZtn2w/h5ezFrZAIWi8XsSCIuweOLnZeXhYdHJuDtZWHRlmyWpB0yO5KIiEcrKClj5ldbAJjYpwUtGtU1OZGI6/D4YgcQFxHC+IubATDt8y0UlZabnEhExHM99d0ODuXbiW0YxC19WpgdR8SlqNj96p+XtSK6XiBZx4p57vudZscREfFIm/Yf491VewGYdUV7Any9zQ0k4mJU7H4V5OfDgyPiAZjzUzpbD+SbnEhExLNUOAymzk/FYcCITlFc3CrU7Eji5I4ePcrYsWOxWq1YrVbGjh3LsWPHzrjNjTfeiMViOeHRvXv32glcC1Tsfqdf23CGtI+gwmFw//zNVDg87m5rIiKmeXfVXjZn2QgO8OHfQ9uZHUdcwHXXXUdKSgqLFi1i0aJFpKSkMHbs2D/dbtCgQRw8eLDqsWDBglpIWzt8zA7gbKYPi2fFjlxSMo/xwZp93NAj1uxIIiJuL9tWwlPf7QDg3kFxNAr2NzmROLtt27axaNEiVq9eTbdu3QD4z3/+Q48ePdi+fTtt2rQ57bb+/v5ERETUVtRapSN2fxAeEsA9gyp3hscXbedQfonJiURE3N+DX2+h0F5OYpN6XNe1idlxxAWsWrUKq9VaVeoAunfvjtVqZeXKlWfcdtmyZYSFhdG6dWsmTJhATk7OGde32+3k5+ef8HBWKnancF23pnSKqUehvbxqyL2IiNSMpWk5LNicjbeXhUdGtsfLS3PWyZ/Lzs4mLCzspOVhYWFkZ2efdrvBgwfzwQcfsGTJEp566inWrl3LpZdeit1uP+02s2fPrrqOz2q1EhMTUy3voSao2J3Cbx8u3l4WFmzO5odtmttORKQmFJWWM+2LVAD+fnEz2kaGmJxIzDZjxoyTBjf88bFu3TqAU05cbRjGGSe0HjNmDEOHDiUhIYFhw4axcOFCduzYwTfffHPabaZMmYLNZqt6ZGZmXvgbrSG6xu402kVVzm332o97eOCLLXRv3pA6/vrfJSJSnZ77fif7jxYTZQ3gn/1amR1HnMBtt93GNddcc8Z1YmNj2bRpE4cOnXzg5fDhw4SHh5/160VGRtK0aVN27jz9VGf+/v74+7vGdZ9qKmfwz8ta8fWmg2QdK+bZ73cwVaO0RESqTWqWjTk/pQMwa2SC/vEsAISGhhIa+udT3fTo0QObzcYvv/xC165dAVizZg02m42ePXue9esdOXKEzMxMIiMjzzuzM9Gp2DMI8vNh1sgEAN78eS+pWTaTE4mIuIcKh8GUeZXTSg3tEMmlcWd/hEUEoG3btgwaNIgJEyawevVqVq9ezYQJE7j88stPGBEbFxfH/PnzASgsLOTuu+9m1apV7N27l2XLljFs2DBCQ0MZOXKkWW+lWqnY/Ym+bcIY2iHy14kzNbediEh1eHvl/+asmz5MZ0Pk/HzwwQe0b9+eAQMGMGDAADp06MB77713wjrbt2/HZqs8MOPt7c3mzZsZMWIErVu3Zty4cbRu3ZpVq1YRHBxsxluodhbDMNRU/kROfgn9nlpOgb2cGcPaceNfmpkdSUTEZWUdK6b/08spKq3gkZHtua6bpjcR15Kfn4/VasVmsxES4lwDfnTE7iyEhQRwz+A4AJ78bgcHbcUmJxIRcU2GYTDt81SKSiu4KLY+11zkvNNGiLgiFbuzdH3XJiQ2+XVuuy+3mh1HRMQlLdiczZK0HHy9Lcy+UnPWiVQ3Fbuz5OVV+SHk42Vh0ZZsFm/V3HYiIufCVlzGjF8nfb+5T0tahrnHNU0izkTF7hzERYQwvldzAKZ/kUqhvdzkRCIiruOxRWkcLrDTvFEdbunTwuw4Im5Jxe4c/bNfK2IaBHLAVsKT3243O46IiEtYuzeP/67JAOCRke0J8PU2OZGIe1KxO0eBft48MrI9AO+s2suGjKMmJxIRcW728gqmzNsMwJguMXRv3tDkRCLuS8XuPPRq1YgrO0djGHDf3E2UljvMjiQi4rReXbaHXTmFhNb1Y8qQOLPjiLg1FbvzNG1oOxrW8WPHoUJeW77b7DgiIk5p9+FCXlq6C4Bpl7ejXpCfyYlE3JuK3XmqX8ePB36dLf2FJbvYlVNociIREefi+PW2YaUVDnq3bsTwjlFmRxJxeyp2F2B4xyj6tGlEaYWDKfM24dDtxkREqny6PpNf0vMI9PVm1hUJWCyas06kpqnYXQCLxcKsKxII8vNm7d6j/PeXDLMjiYg4hUP5Jcz6ZhsAd/ZvRUyDIJMTiXgGFbsL1Lh+EP8a2AaAxxamkW0rMTmRiIj5HvgilYKSctpHW/mb7q8tUmtU7KrBDT1i6RRTjwJ7OdO+SMUwdEpWRDzXws0H+XbLIXy8LDw2qgM+3vpTI1Jb9NtWDby9LDw6qvJ2Y4u3HmJRarbZkURETHGsqJRpX/x227AWtIsKMTmRiGdRsasmcREh3PzrLXIe+HILtqIykxOJiNS+h7/ZRm6hnRaN6nDbpS3NjiPicVTsqtGtfVvSvFEdDhfYeXTRNrPjiIjUqhU7D/Pp+v1YLPDYqA74++i2YSK1TcWuGgX4evPolR0A+PCXTFbuzjU5kYhI7SgqLa+6bdgN3ZvSJbaByYlEPJOKXTXr2qwB13drAsB9czdTVFpuciIRkZr35Lc72H+0mOh6gfxrkG4bJmIWFbsacN/gOKKsAWTkFfHktzvMjiMiUqM2ZBzlrZXpADw8MoG6/j4mJxLxXCp2NSA4wJdHrmwPwFsr01m/L8/kRCIiNcNeXsG9n23CMODKxGj6tAkzO5KIR1OxqyF92oRxVVJjDAP+9dkmSsoqzI4kIlLtXl66m505hTSs48e0y9uZHUfE46nY1aBpQ9vRKNifPYeP8+z3O82OIyJSrbZnF/Dysl0AzBwRT/06fiYnEhEVuxpkDfLl4SsSAHj9x91szDxmbiARkWpS4TC4d+4myioMLmsbztD2kWZHEhFU7GrcgPgIhnWMwmHAPZ9torTcYXYkEZEL9uZP6aRkHiPY34dZVyRgsVjMjiQiqNjVipnD42lYx4/thwp4cekus+OIiFyQ3YcLefK77QD8+/K2RFgDTE4kIr9RsasFDer4MXNEPAAvL93F1gP5JicSETk/FQ6Dez7bhL3cQa9WoVzdJcbsSCLyOyp2tWRo+0gGxodT7jD412cbKavQKVkRcT1v/ZzO+n1Hqevvw6OjOugUrIiTUbGrJRaLhYeuSMAa6MuWA/m8/uMesyOJiJyT9NzjVadgpw5tS3S9QJMTicgfqdjVorDgAKYPq5zn6bnvd7LzUIHJiUREzo7DYXDPZxspKXNwcctQrrlIp2BFnJGKXS0bmRhN3zaNKK1w8K/PNlHhMMyOJCLyp95ZtZe1e49Sx8+bR0e11ylYESelYlfLLBYLj1zZnmB/H1Iyj/HWz+lmRxIROaO9ucd5bFEaAPcPbUvj+kEmJxKR01GxM0GkNZD7h7YF4Ilvt7PncKHJiURETs3hMLhn7iZKyhz0bNGQ67o2MTuSiJyBip1Jrrkohr+0bIi93MHdn27UKVkRcUrvrd7HL+l5BPl585hGwYo4PRU7k1gsFh4b1YG6/j5syDjGf1ZolKyIOJeMI0U8urDyFOyUwXHENNApWBFnp2Jnosb1g3jg8spRsk9/t4Pt2RolKyLOofIU7EaKyyro3rwB13dranYkETkLKnYmG92lMZfGhVFa4WDyJymauFhEnMLbK/eyek/lKdjHR3XEy0unYEVcgYqdySwWC49e2b5q4uIXl+hesiJirl05hf8bBTukLU0a6hSsiKtQsXMCYSEBPHRFAgAvLt3F5v02kxOJiKcqr3Bw16cbsZc7uKR1I67vplGwIq5Exc5JDOsQydD2kVQ4DCZ/kkJJWYXZkUTEA72ybDcbM48REuDD4xoFK+JyVOycxG/3kg2t68/OnEKeWbzD7Egi4mFSs2w898NOAB4ckUCENcDkRCJyrlTsnEiDOn7MvrI9AK+v2MO6vXkmJxIRT2Evr+CuTzZS7jAYnBDBiE5RZkcSkfOgYudk+rcL56qkxhgG3PXpRopKy82OJCIe4OnFO9h+qIDQun7MuiJBp2BFXJSKnRN6YFg7oqwB7Pvd5KAiIjVl3d48Xv+xcpL02Vd2oGFdf5MTicj5UrFzQiEBvjx+VUcA3l21j5925pqcSETc1XF7OXd9uhHDgFGdG9O/XbjZkUTO2sMPP0zPnj0JCgqiXr16Z7WNYRjMmDGDqKgoAgMD6dOnD1u2bKnZoLVIxc5JXdwqlLHdK2d6v+ezjeSXlJmcSETc0eyF29h3pIgoawDTh7czO47IOSktLWX06NHcfPPNZ73N448/ztNPP82LL77I2rVriYiIoH///hQUuMfdn1TsnNh9g+No2jCIA7YSZnzhPv+aEBHn8OOOw7y/OgOAJ0Z3JCTA1+REIudm5syZ3HnnnbRv3/6s1jcMg2effZapU6dy5ZVXkpCQwDvvvENRURH//e9/azht7VCxc2J1/H14anRHvCwwLzmLrzcdMDuSiLiJo8dL+ddnGwEY16Mpf2kZanIikZqXnp5OdnY2AwYMqFrm7+9P7969WblypYnJqo+KnZPrEtuAW/u2BGDq/FQO2opNTiQirs4wDKbM28yhfDvNG9XhvsFtzY4kUiuys7MBCA8/8VrS8PDwqudOxW63k5+ff8LDWanYuYA7+rWiY2MrtuIy7vpkIw6HYXYkEXFhn67bz6It2fh6W3j+mkQC/bzNjiRSZcaMGVgsljM+1q1bd0Gv8cfpfAzDOOMUP7Nnz8ZqtVY9YmJiLuj1a5KP2QHkz/l6e/HMmE4Mff4nVu4+whs/pTPhkuZmxxIRF5See5wZX1Veszu5fxsSoq0mJxI50W233cY111xzxnViY2PP63tHREQAlUfuIiMjq5bn5OScdBTv96ZMmcLkyZOrvs7Pz3facqdi5yKaN6rLtMvbcf/8zTzx7Xb+0jKUdlEhZscSERdSVuFg0scpFJVW0K1ZA/6hfyCKEwoNDSU0tGau+WzWrBkREREsXryYxMREoHJk7fLly3nsscdOu52/vz/+/q4xv6NOxbqQa7vGcFnbcEorHEz6OJmSsgqzI4mIC3nhh51szDxGSIAPz4zphLeX7i4hri0jI4OUlBQyMjKoqKggJSWFlJQUCgsLq9aJi4tj/vz5QOUp2EmTJvHII48wf/58UlNTufHGGwkKCuK6664z621UKx2xcyEWi4XHRrVn4LPH2HGokMcWpTF9WLzZsUTEBazdm8eLS3cB8PDI9kTVCzQ5kciFe+CBB3jnnXeqvv7tKNzSpUvp06cPANu3b8dms1Wtc88991BcXMwtt9zC0aNH6datG9999x3BwcG1mr2mWAzD0JX4Lmbp9hz+7621ALz7t65c0rqRyYlExJnll5Qx5LkV7D9azJWJ0Tw9ppPZkURcWn5+PlarFZvNRkiIc10WpVOxLqhvmzBu6FF5V4q7Pt1I3vFSkxOJiDOb8cUW9h8tJqZBIDNH6Ci/iDtTsXNRUwa3pWVYXQ4X2JkybxM68Coip/LlxgPMS87CywLPXN2JYN1dQsStqdi5qEA/b54d0wlfbwvfbjnEx2szzY4kIk4m61gxU+dvBuC2vi3pEtvA5EQiUtNU7FxYQrSVuwa0AWDGV1vYccg9bmAsIheuwmEw+eMUCkrK6RRTj9v7tTI7kojUAhU7F/ePXs3p1SqUkjIHt36wgeJSTYEiIvDq8t2sSc8jqOrovj7uRTyBftNdnJeXhWfGdKJRsD87cwqZ8eUWsyOJiMnW7c3j6cU7AJgxLJ7Y0DomJxKR2qJi5wZC6/rz3DWdsFjg43WZfJGSZXYkETHJ0eOl3PFhMhUOgxGdohjdpbHZkUSkFqnYuYmeLUK5/dLKa2jun7eZ9NzjJicSkdpmGAb/+mwjB2wlxDYM4uGR7c94Y3MRcT8qdm7kn/1a0a1ZA46XVnDrBxt0yzERD/Pmz3v5flsOft5evHhdZ+r66+ZCIp5Gxc6NeHtZeO6aRBrU8WPrwXxmL9hmdiQRqSUbM4/x6MLK3/l/X96WhGiryYlExAwqdm4mwhrAU1d3BOCdVftYlHrQ5EQiUtPyS8q47cMNlFUYDE6IYGz3pmZHEhGTqNi5ob5twripd3MA7vlsE5l5RSYnEpGaYhgG983dRGZeMY3rB/LoqA66rk7Eg6nYuam7B7QhsUk98kvKuf3DZMoqHGZHEpEa8MGaDBZszsbHy8KL13XGGqhbhol4MhU7N+Xr7cXz1yQSEuBDSuYxnvx2u9mRRKSabT2Qz4NfbwXgvsFxdIqpZ24gETGdip0bi2kQxONXVV5v99qPe1ialmNyIhGpLsft5dz23w2UljvoFxfG3y9uZnYkEXECKnZublBCBDf2jAVg8icpZNtKzA0kIhfMMAz+/Xkqe3KPE2kN4MnRHXVdnYgAKnYeYcqQOBKiQzhaVMYdHyVTruvtRFzaZ+v3Mz85C28vC89fm0j9On5mRxIRJ6Fi5wH8fbx58drKyUp/Sc/j+SW7zI4kIudp56ECHvii8p7Qk/u35qLYBiYnEhFnomLnIWJD6/DwyAQAXliyk5W7ck1OJCLnqqCkjJveW09xWQUXtwzl5t4tzI4kIk5Gxc6DjOgUzTUXxWAYcMdHyRy0FZsdSUTOkmEY3P3pxqrr6p69phNeXrquTkROpGLnYaYPi6ddZAi5haVMfH8D9nLdT1bEFbyyfDffbjmEn7cXL1/fmdC6/mZHEhEnpGLnYQL9vHltbBL1gnzZmHmM6b9eqyMizuunnblVc1HOGB5PYpP6JicSEWelYueBYhoE8fw1iXhZ4KO1mXz4S4bZkUTkNPYfLeL2DzfgMODqLo25tmuM2ZFExImp2HmoS1o34u6BbQCY/sUWkjOOmpxIRP6opKyCm9/fwNGiMtpHW3lwRILmqxORM1Kx82A3927BoPgISisc3Pz+Bg4X2M2OJCK/M/2LLWzOslE/yJdX/tqZAF9vsyOJiJNTsfNgFouFJ6/uSMuwumTnl3DrfzdQpsmLRZzCh79k8PG6TLws8Py1iTSuH2R2JBFxASp2Hq6uvw+vjU0i+NfJix9ZsM3sSCIeL+V3A5vuGtCGXq0amZxIRFyFip3QolFdnrq6IwBv/byX+cn7TU4k4rmOFNq55f31lFY4GNAunFv6aBJiETl7KnYCwID4CG6/tCUAU+ZtZssBm8mJRDxPeYWD2z9M5oCthOahdXjq6o4aLCEi50TFTqpMuqw1fdo0oqTMwU3vredYUanZkUQ8yhPfbmfl7iME/TrfZHCAr9mRRMTFqNhJFW8vC8+NSaRJgyD2Hy3m9g+TqXAYZscS8Qhz1+/ntR/3APDEVR1pFR5sciIRcUUqdnICa5Avr41NItDXmxU7c3nqu+1mRxJxe2v35jFl3mYAbu3bgqEdIk1OJCKuSsVOTtI2MoTHruoAwMvLdvN5cpbJiUTcV2ZeETe9VzlYYnBCBHf1b2N2JBFxYSp2ckrDO0YxsXflaLx7PtvEur15JicScT8FJWX8/Z215B0vJSE6hKeu7oiXlwZLiMj5U7GT07pnYBsGxodTWuHgH++tJ+NIkdmRRNxGhcPgjg+T2XGokLBgf+bccBFBfj5mxxIRF6diJ6fl5WXhmTGdSIgOIe94KX97Zy224jKzY4m4hYe/2cbS7YcJ8PVizrguRFgDzI4kIm5AxU7OKMjPhzfGXURESAC7cgq5TbcdE7lg/12TwZs/pwPw1OhOdGhcz9xAIuI2VOzkT4WHBDBnXJeqkbIzvtyCYWgaFJHzsXJ3Lg98kQrA5P6tNQJWRKqVip2clYRoK89fm4jFAh+syeDNn/eaHUnE5ew5XMjN72+g3GEwolNU1d1eRESqi4qdnLX+7cK5f3BbAGZ9s5Ufth0yOZGI67AVlTH+nXXYisvoFFOPx0Z10O3CRKTaqdjJORnfqxnXdo3BMOD2D5PZeiDf7EgiTq+swsEt/13PntzjRFkDeP2GJAJ8vc2OJSJuSMVOzonFYuHBEQn8pWVDikor+Ps7a8nJLzE7lojTMgyD6V9u4eddlfeAnTPuIsKCNQJWRGqGip2cM19vL16+Lonmjepw0FbC+HfXUVRabnYsEaf0/A+7+O+aDCwWeO6aRNpFhZgdSUTcmIqdnBdrkC9v3XgR9YN82bTfxq0faBoUkT/6YM0+nvl+BwAzh8fTv124yYlExN2p2Ml5a9qwDnPGdSHA14ul2w9z72ebcDg0DYoIwKLUbKZ9Xjmtye2XtuSGHrHmBhJxQw8//DA9e/YkKCiIevXqndU2N954IxaL5YRH9+7dazZoLVKxkwuS1LQBL1/fGW8vC/OSs3hkwTbNcSceb82eI9zxUTIOA665KIbJ/VubHUnELZWWljJ69Ghuvvnmc9pu0KBBHDx4sOqxYMGCGkpY+3RjQrlgl8aF8/ioDtz16Ubm/JROaLA/E3u3MDuWiCnSsvMZ/+46SssdXNY2nFlXJGhaE5EaMnPmTADefvvtc9rO39+fiIiIGkhkPh2xk2oxKqkxU4dUznH36MI0PlmXaXIikdqXmVfEDW/8QkFJORfF1ufF6xLx8dbHrIizWbZsGWFhYbRu3ZoJEyaQk5NjdqRqoyN2Um0mXNKc3ON2Xlu+hynzNtMgyI/LdLG4eIi846WMe/MXcgrstA6vy5wbLtJcdSJOaPDgwYwePZqmTZuSnp7OtGnTuPTSS1m/fj3+/v6n3MZut2O326u+zs933jlc9U9JqVb3DYrjqqTGVDgMbv3vBtbuzTM7kkiNKyot5//eXls1AfE7f+uKNcjX7FgiLmnGjBknDW7442PdunXn/f3HjBnD0KFDSUhIYNiwYSxcuJAdO3bwzTffnHab2bNnY7Vaqx4xMTHn/fo1zWLoSnepZuUVDm56bz0/pOUQEuDDJxN7EBehubvEPZVVOBj/zjqW7zhMvSBfPpvYg5ZhwWbHEnFZubm55ObmnnGd2NhYAgL+N9H322+/zaRJkzh27Nh5vWarVq0YP34899577ymfP9URu5iYGGw2GyEhzvX3Tadipdr5eHvx4nWdGfvGGtbtO8oNb/zC3Jt7EtMgyOxoItXK4TC497NNLN9xmABfL9688SKVOpELFBoaSmhoaK293pEjR8jMzCQyMvK06/j7+5/2NK2z0alYqRGBft68Me4i2oQHk1Ng54Y3fyG30P7nG4q4CMMwmPHVFuYlZ+HtZeHl6zvTuUl9s2OJeJSMjAxSUlLIyMigoqKClJQUUlJSKCwsrFonLi6O+fPnA1BYWMjdd9/NqlWr2Lt3L8uWLWPYsGGEhoYycuRIs95GtVKxkxpjDfLl3b93JbpeIOm5x/nrnDUcUbkTN2AYBg99vY13V+3DYoHHR3Xg0jgNFBKpbQ888ACJiYlMnz6dwsJCEhMTSUxMPOEavO3bt2Oz2QDw9vZm8+bNjBgxgtatWzNu3Dhat27NqlWrCA52j6PtusZOalx67nHGvLaKnAI7cRHBfDC+Gw3rusYhbZE/MgyDRxel8dryPQA8emV7runaxORUIlKb8vPzsVqtTnmNnY7YSY1rFlqHj/7RnbBgf9KyC7juPzpyJ67r6cU7qkrdQ1ckqNSJiFNRsZNa0bxR3apyt/1QZbnTNXfiap7/YScvLNkFwPRh7RjbvanJiURETqRiJ7Xmt3IXHlJZ7q5XuRMX8vKyXTy9eAcAU4e05f/+0szkRCIiJ1Oxk1rVvFFdPpzwv3J33X9Wq9yJ05uzYg+PL9oOwL8GtmHCJc1NTiQicmoqdlLrKo/c9SA8xJ8dhwpV7sSpvf1zOrO+2QbAnZe15ta+LU1OJCJyeip2YorKARUqd+LcXl2+mxlfbQXgtr4tuaOfSp2IODcVOzHNH8vdta+v5nCByp2YzzAMHluUxqML0wC4pU8L7hrQGovFYnIyEZEzU7ETU/1W7iJCAtiZU3nkTuVOzORwGPz781ReWbYbgPsGx3HPoDiVOhFxCSp2YrpmoXX48B/dTyh3OQUlZscSD1RW4WDSxyl8sCYDiwUeGdmeib1bmB1LROSsqdiJU/hjubvy5ZXsyin88w1FqklxaQX/eHcdX248gK+3heevSeS6bpp8WERci4qdOI1moXX4+KbuxDYMYv/RYka9spK1e/PMjiUeIL+kjHFv/sLS7YcJ8PXiPzd0YVjHKLNjiYicMxU7cSpNG9Zh7s096RRTD1txGdfPWcOCzQfNjiVu7Eihnev+s5pf9uYR7O/De3/vRp82YWbHEhE5Lyp24nQa1vXnwwnduaxtOKXlDm797wbmrNhjdixxQweOFTP6tVWkZuXTsI4fH/6jOxfFNjA7lojIeVOxE6cU6OfNa2OTGNu9KYYBs77ZxoNfbcXhMMyOJm5iz+FCRr+6ij2HjxNlDeCTiT1IiLaaHUtE5IKo2InT8vay8OCIeO4bHAfAmz+nc9uHGygpqzA5mbi6NXuOMOqVlWQdK6Z5aB0+vbknLRrVNTuWiMgFU7ETp2axWJjYuwXPXdMJX28LCzZn89c5azh6vNTsaOKiPlmXyV/fWMPRojI6NLbyycQeRNcLNDuWiEi1ULETlzCiUzTv/q0bwQE+rNt3lFGvriQzr8jsWOJCKhwGjyzYxj2fbaKswmBo+0g+/kcPQuv6mx1NRKTaqNiJy+jRoiFzb+5JlDWAPYePM/LllWzebzM7lriAQns5N723ntd/rByE889+rXjh2kQC/bxNTiYiUr1U7MSltA4PZt4tfyEuIpjcQjtjXl/F0rQcs2OJE9t/tIirXlnJ99sO4efjxfPXJnJn/9Z4eekWYSLiflTsxOVEWAP4dGIPerUKpai0gvHvruM/P+7BMDRiVk60ft9RrnjpZ9KyCwit68/H/+jOcE08LCJuzGLor6G4qLIKB1Pmbeaz9fsBGNAunCdGd8Qa6GtyMnEGnydncc9nmyitcNA2MoQ3xnUhSoMkRKQa5OfnY7VasdlshISEmB3nBCp24tIMw+D9NRk89NVWSiscxDQI5OXrkmjfWPORearScgePL0pjzk/pQGXhf2ZMJ+r4+5icTETchYqdSA3btP8Yt3ywgf1Hi/Hz9uKBYe24vlsTLBZdR+VJMo4UcfuHG9j466Cam/u04F8D2uh6OhGpVip2IrXAVlTG3Z9tZPHWQwCM6BTFIyPb60iNh/hm00Hum7uJAns51kBfnhzdkf7tws2OJSJuSMVOpJYYhsGcFek8uiiNCodBi0Z1ePn6JNpEBJsdTWpISVkFs77ZyvurMwBIalqf569N1KTDIlJjVOxEatm6vXnc9t9ksvNLCPD14uEr2jMqqbHZsaSa7T5cyK0fbCAtuwCAW/q04M7+rfH11oB/Eak5KnYiJjhSaGfSxyms2JkLwJguMcwcEU+AryaldQfzNuzn35+nUlRaQcM6fjw9phO9WzcyO5aIeAAVOxGTVDgMXlq6i2e+34FhQPNGdXj0yg50bdbA7GhynmzFZTz41Vbmbqic5qZH84Y8d00nwkICTE4mIp5CxU7EZD/vymXSxykcLrAD8NfuTbh3UBzBAZrzzlUYhsGi1Gymf7mFnAI7Xhb4Z7/W3HZpS7w16lVEapGKnYgTsBWXMXvBNj5amwlAREgAs65I4DKNnHR6B23FPPDFlqoRz81D6/DoKB15FRFzqNiJOJGVu3OZMm8z+44UAXB5h0hmDI8ntK6/ycnkjyocBu+v3scT326n0F6Oj5eFm/u04Na+LXWtpIiYRsVOxMmUlFXwzPc7mLMinQqHQb0gX/49tB2jOkdrUmMnsT27gPvmbSI54xgAnZvUY/aVHTR1jYiYTsVOxEmlZtm457NNbD2YD0CvVqE8MrI9MQ2CTE7muUrKKnhxyS5eXb6bcodBXX8f7hnUhr92a6o7SIiIU1CxE3FiZRUO5qxI59nvd2AvdxDo683k/q0Z1zMWPx/Nh1abVu0+wv3zN5OeexyA/u3CeXBEPJFWTTYsIs5DxU7EBaTnHmfKvE2s3pMHQGzDIO4bHMfA+Aidnq1hu3IKeOLb7Xy7pXJwRFiwPw+OiGdQQqTJyURETqZiJ+IiHA6Dz9bv5/Fvt5NbWDk1StfYBtw/tC2dYuqZG84NHThWzLPf7+Cz9ftxGOBlgWu7NuHewXGEaCoaEXFSKnYiLqbQXs7ry3fz+oo9lJQ5ABgUH8Gk/q2Ii3CuX2JXdPR4Ka8s383bK/dSWl75/3dAu3D+NbANrcI1OEJEnJuKnYiLOmgr5slvdzAveT+//aYMbR/JPy9rRWsVkHNWaC/nnZV7eXXZbgrs5QB0bdaAewfFkdS0vsnpRETOjoqdiIvbeaiAZ3/YyTebDgJgscDAdhFMuKS5CslZyC208/bPe3l31V7ySyoLXVxEMPcOiqNPm0a6hlFEXIqKnYibSMvO57nvd7IwNbtqWecm9fjHJc3p3y5Ct7b6g92HC3n75718si4T+6+nXJuH1uH2fi0Z0TFa05eIiEtSsRNxMzsOFTBnxR4+Tz5AaUVlYWnaMIix3ZsyMjGahh58F4vyCgc/pOXw3qp9/LQrt2p5x8ZWbu7TQgVYRFyeip2Im8opKOHdlft4f80+jhWVAeDrbaF/u3Cu7hJDr1aNPKbEZBwpYl7yfj5dt5+sY8VA5SnrfnFh/O0vzejRoqFOuYqIW1CxE3FzRaXlzE/O4uO1mWzab6taHmUNYGTnaC7vEEVcRLDbFZtjRaV8uyWbueuz+GVvXtXy+kG+jLmoCdd3a6K7eIiI21GxE/Eg2w7m8/HaTOYnZ2ErLqta3jy0DkM7RDKgXQTxUSEue31ZTn4J32/LYWHqQVbtPkK5o/IjxGKBi1uGMqpzYwYlRBDg621yUhGRmqFiJ+KBSsoqWLz1EF9tPMCyHYer5msDCK3rT+/WjejTphE9WjQk1ImvybOXV7B+31F+3JHL8h2H2fbrfXV/ExcRzPBOUYxMjNatv0Sk1uzdu5eHHnqIJUuWkJ2dTVRUFH/961+ZOnUqfn5+p93OMAxmzpzJ66+/ztGjR+nWrRsvvfQS8fHxZ/3azlzsfMwOIOKuAny9GdYximEdoygoKWNJWg4LNh/kp5255BbambthP3M37AegVVhdusQ2IKlpfTrFWGkWWte0a/NyC+1szDzG2r1HWb8vj437bSeUUosFOkRbGZgQweCESJqF1jElp4h4trS0NBwOB6+99hotW7YkNTWVCRMmcPz4cZ588snTbvf444/z9NNP8/bbb9O6dWtmzZpF//792b59O8HBrj8/qY7YidSy0nIH6/bmsSQth5925ZKWXXDSOkF+3rSJCCYuIpjmoXWJDa1DbMMgGtcPItDvwk9xVjgMDuWXkJFXxN7c4+zJPc6OQwVsO5jPoXz7SeuH1vXjklaN6N2mERe3DPXoUb8i4ryeeOIJXnnlFfbs2XPK5w3DICoqikmTJnHvvfcCYLfbCQ8P57HHHuOmm246q9fRETsRqeLn40XPlqH0bBkKQN7xUn5JzyM54yjr9x1ly4F8ikorSM44RnLGsZO2rxfkS6O6/jSs60e9QD9CAn0I8vPB39cLXy+vymv3DINyh4G93EFxWQUFJeXkF5eRd7yUwwV2DhfaqXCc+t90Fkvl9YBdmjYgKbY+XZrWp1loHbcb+CEi7sdms9GgQYPTPp+enk52djYDBgyoWubv70/v3r1ZuXLlWRc7Z6ZiJ2KyBnX8GJQQwaCECKDyaNqew4WkZRew41AB6bnH2XvkOHtziyi0l3OsqIxjRWXszLmw1/XxshBVL5DY0Do0D61Dq/C6tAkPpm1kCHX89dEgIq5l9+7dvPDCCzz11FOnXSc7u3Jy+fDw8BOWh4eHs2/fvtNuZ7fbsdv/dzYjPz//tOuaTZ/eIk7G28tCq/BgWv3hXrSGYZBfUk62rYTcQju5hXbyfz0SV1RaTkmZgwqHQYXDwGIBL4sFf18vAn29CQ7wJSTAhwZ1/Ait6094SACNgv09Zo49EXEdM2bMYObMmWdcZ+3atXTp0qXq6wMHDjBo0CBGjx7N+PHj//Q1/ngGwjCMM56VmD179p9mcha6xk5EREScRm5uLrm5uWdcJzY2loCAAKCy1PXt25du3brx9ttv4+Xlddrt9uzZQ4sWLdiwYQOJiYlVy0eMGEG9evV45513TrndqY7YxcTE6Bo7ERERkTMJDQ0lNDT0rNbNysqib9++JCUl8dZbb52x1AE0a9aMiIgIFi9eXFXsSktLWb58OY899thpt/P398ff3zUGjZ35/4CIiIiIEzpw4AB9+vQhJiaGJ598ksOHD5OdnV11Hd1v4uLimD9/PlB5CnbSpEk88sgjzJ8/n9TUVG688UaCgoK47rrrzHgb1U5H7ERERMTlfPfdd+zatYtdu3bRuHHjE577/VVm27dvx2b7360e77nnHoqLi7nllluqJij+7rvv3GIOO9A1diIiIiLnxJnnsdOpWBERERE3oWInIiIi4iZU7ERERETchIqdiIiIiJtQsRMRERFxEyp2IiIiIm5CxU5ERETETajYiYiIiLgJFTsRERERN6FiJyIiIuImVOxERERE3ISKnYiIiIibULETERERcRMqdiIiIiJuQsVORERExE1YDMMwzA4hIiIi4ioMw6CgoIDg4GAsFovZcU6gYiciIiLiJnQqVkRERMRNqNiJiIiIuAkVOxERERE3oWInIiIi4iZU7ERERETchIqdiIiIiJtQsRMRERFxE/8P4IOpjNKqepkAAAAASUVORK5CYII=\n",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/plain": [
       "<sympy.plotting.plot.Plot at 0x7f2650dee3d0>"
      ]
     },
     "execution_count": 474,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "plot(expr,(x,-2*pi/3,0))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 476,
   "id": "b1c74ae8",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "3.00000000000000\n",
      "3.50000000000000\n",
      "3.79248125036058\n",
      "4.00000000000000\n",
      "4.16096404744368\n",
      "4.29248125036058\n",
      "4.40367746102880\n",
      "4.50000000000000\n",
      "4.58496250072116\n",
      "4.66096404744368\n"
     ]
    }
   ],
   "source": [
    "for i in range(10):\n",
    "    print(N(log(i+1,2)/2+3))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 482,
   "id": "2f96738e",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\begin{cases} 2^{x} & \\text{for}\\: x \\geq 0 \\wedge x \\leq 2 \\\\\\left|{x - 6}\\right| & \\text{for}\\: x > 2 \\end{cases}$"
      ],
      "text/plain": [
       "Piecewise((2**x, (x >= 0) & (x <= 2)), (Abs(x - 6), x > 2))"
      ]
     },
     "execution_count": 482,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "expr=Piecewise((2**x,(0<=x) & (x<=2)),(abs(x-6),x>2))\n",
    "expr"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 483,
   "id": "a1d4b78f",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\begin{cases} \\begin{cases} 2^{x} & \\text{for}\\: x \\geq 0 \\wedge x \\leq 2 \\\\\\left|{x - 6}\\right| & \\text{for}\\: x > 2 \\end{cases} & \\text{for}\\: x \\geq 0 \\\\\\begin{cases} 2^{- x} & \\text{for}\\: x \\geq -2 \\wedge x \\leq 0 \\\\\\left|{x + 6}\\right| & \\text{for}\\: x < -2 \\end{cases} & \\text{otherwise} \\end{cases}$"
      ],
      "text/plain": [
       "Piecewise((Piecewise((2**x, (x >= 0) & (x <= 2)), (Abs(x - 6), x > 2)), x >= 0), (Piecewise((2**(-x), (x >= -2) & (x <= 0)), (Abs(x + 6), x < -2)), True))"
      ]
     },
     "execution_count": 483,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "p=Piecewise((expr,x>=0),(expr.subs(x,-x),True))\n",
    "p"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 484,
   "id": "f0622bf0",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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RESapspyJ0REREQ0eQzsiIiIiHSCgR0RERGRTjCwIyIiItIJBnZEREREOsHAjoiIiEgnGNgRERER6QQDOyIiIiKdYGBHREREpBMM7IiIiIh0goEdERERkU4wsCMi3fr9738Ph8OBxsZG+bZHH30US5YsQXd3t4ItIyIKD5MkSZLSjSAiCgdJkrBs2TKsW7cOv/zlL/GDH/wAv/vd73D48GHMmDFD6eYREYWcVekGEBGFi8lkwnPPPYe//du/RU5ODn7xi19g3759DOqISLc4Y0dEurdixQqcOnUKH374IcrKypRuDhFR2HCPHRHp2p///GecPXsWXq8XmZmZSjeHiCisOGNHRLp1/PhxlJeX41e/+hXeeustxMTE4A9/+IPSzSIiChvusSMiXbp06RLuvvtufP/738eDDz6IhQsX4tZbb8WxY8dQXFysdPOIiMKCM3ZEpDsdHR1Ys2YN1q9fj9/85jfy7ffeey+cTic++OADBVtHRBQ+DOyIiIiIdILJE0REREQ6wcCOiIiISCcY2BERERHpBAM7IiIiIp1gYEdERESkEwzsiIiIiHSCgR0RERGRTjCwIyIiItIJBnZEREREOsHAjoiIiEgnGNgRERER6cT/H23KDRnsd70PAAAAAElFTkSuQmCC\n",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/plain": [
       "<sympy.plotting.plot.Plot at 0x7f265087e8b0>"
      ]
     },
     "execution_count": 484,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "plot(p,(x,-10,10))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 485,
   "id": "fdb07b62",
   "metadata": {},
   "outputs": [],
   "source": [
    "q=quadratic_function(5,-7,-6)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 487,
   "id": "b920c7f5",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\left\\{- \\frac{3}{5}, 2\\right\\}$"
      ],
      "text/plain": [
       "{-3/5, 2}"
      ]
     },
     "execution_count": 487,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "solveset(q.to_expr(x),x,Reals)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 489,
   "id": "23021a4b",
   "metadata": {},
   "outputs": [],
   "source": [
    "t=symbols(\"t\",real=True)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 491,
   "id": "bd5a6293",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\left\\{2 n \\pi + \\operatorname{atan}{\\left(\\frac{4}{3} \\right)}\\; \\middle|\\; n \\in \\mathbb{Z}\\right\\} \\cup \\left\\{2 n \\pi - \\operatorname{atan}{\\left(\\frac{4}{3} \\right)} + 2 \\pi\\; \\middle|\\; n \\in \\mathbb{Z}\\right\\}$"
      ],
      "text/plain": [
       "Union(ImageSet(Lambda(_n, 2*_n*pi - atan(4/3) + 2*pi), Integers), ImageSet(Lambda(_n, 2*_n*pi + atan(4/3)), Integers))"
      ]
     },
     "execution_count": 491,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "solveset(cos(t)-Rational(3,5),t,Reals)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 492,
   "id": "4fdf590b",
   "metadata": {
    "collapsed": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Help on built-in function iter in module builtins:\n",
      "\n",
      "iter(...)\n",
      "    iter(iterable) -> iterator\n",
      "    iter(callable, sentinel) -> iterator\n",
      "    \n",
      "    Get an iterator from an object.  In the first form, the argument must\n",
      "    supply its own iterator, or be a sequence.\n",
      "    In the second form, the callable is called until it returns the sentinel.\n",
      "\n"
     ]
    }
   ],
   "source": [
    "help(iter)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 493,
   "id": "e3f28e6e",
   "metadata": {},
   "outputs": [],
   "source": [
    "q=quadratic_function(2,1,-1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 494,
   "id": "7d170529",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\left\\{-1, \\frac{1}{2}\\right\\}$"
      ],
      "text/plain": [
       "{-1, 1/2}"
      ]
     },
     "execution_count": 494,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "q.roots"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 496,
   "id": "8a7969ec",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\frac{\\tan{\\left(x \\right)} \\tan{\\left(2 x \\right)}}{- \\tan{\\left(x \\right)} + \\tan{\\left(2 x \\right)}}$"
      ],
      "text/plain": [
       "tan(x)*tan(2*x)/(-tan(x) + tan(2*x))"
      ]
     },
     "execution_count": 496,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "expr=tan(x)*tan(2*x)/(tan(2*x)-tan(x))\n",
    "expr"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 497,
   "id": "9550bd7b",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\left(-1, 0\\right) \\cup \\left(0, 1\\right)$"
      ],
      "text/plain": [
       "Union(Interval.open(-1, 0), Interval.open(0, 1))"
      ]
     },
     "execution_count": 497,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "function_range(expr,x,Reals)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 498,
   "id": "7b8401e0",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\sin{\\left(x \\right)} + \\cos{\\left(2 x \\right)}$"
      ],
      "text/plain": [
       "sin(x) + cos(2*x)"
      ]
     },
     "execution_count": 498,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "expr=sin(x)+cos(2*x)\n",
    "expr"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 499,
   "id": "ded09ffd",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\left[-2, 1\\right]$"
      ],
      "text/plain": [
       "Interval(-2, 1)"
      ]
     },
     "execution_count": 499,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "function_range(expr,x,Interval(-pi,0))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 501,
   "id": "b6634df7",
   "metadata": {
    "collapsed": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Help on function is_monotonic in module sympy.calculus.singularities:\n",
      "\n",
      "is_monotonic(expression, interval=Reals, symbol=None)\n",
      "    Return whether the function is monotonic in the given interval.\n",
      "    \n",
      "    Parameters\n",
      "    ==========\n",
      "    \n",
      "    expression : Expr\n",
      "        The target function which is being checked.\n",
      "    interval : Set, optional\n",
      "        The range of values in which we are testing (defaults to set of\n",
      "        all real numbers).\n",
      "    symbol : Symbol, optional\n",
      "        The symbol present in expression which gets varied over the given range.\n",
      "    \n",
      "    Returns\n",
      "    =======\n",
      "    \n",
      "    Boolean\n",
      "        True if ``expression`` is monotonic in the given ``interval``,\n",
      "        False otherwise.\n",
      "    \n",
      "    Raises\n",
      "    ======\n",
      "    \n",
      "    NotImplementedError\n",
      "        Monotonicity check has not been implemented for the queried function.\n",
      "    \n",
      "    Examples\n",
      "    ========\n",
      "    \n",
      "    >>> from sympy import is_monotonic\n",
      "    >>> from sympy.abc import x, y\n",
      "    >>> from sympy import S, Interval, oo\n",
      "    >>> is_monotonic(1/(x**2 - 3*x), Interval.open(S(3)/2, 3))\n",
      "    True\n",
      "    >>> is_monotonic(1/(x**2 - 3*x), Interval.open(1.5, 3))\n",
      "    True\n",
      "    >>> is_monotonic(1/(x**2 - 3*x), Interval.Lopen(3, oo))\n",
      "    True\n",
      "    >>> is_monotonic(x**3 - 3*x**2 + 4*x, S.Reals)\n",
      "    True\n",
      "    >>> is_monotonic(-x**2, S.Reals)\n",
      "    False\n",
      "    >>> is_monotonic(x**2 + y + 1, Interval(1, 2), x)\n",
      "    True\n",
      "\n"
     ]
    }
   ],
   "source": [
    "help(is_monotonic)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 502,
   "id": "6e861a58",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "False"
      ]
     },
     "execution_count": 502,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "is_decreasing(expr,Interval(-2*pi,-pi/2*3))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 503,
   "id": "c9009cf8",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\left\\{- \\frac{5 \\pi}{6}, - \\frac{\\pi}{6}, \\frac{\\pi}{2}\\right\\}$"
      ],
      "text/plain": [
       "{-5*pi/6, -pi/6, pi/2}"
      ]
     },
     "execution_count": 503,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "solveset(expr,x,Interval(-pi,pi))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 504,
   "id": "f892d74b",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle 4 \\cos^{3}{\\left(x \\right)} - 3 \\cos{\\left(x \\right)}$"
      ],
      "text/plain": [
       "4*cos(x)**3 - 3*cos(x)"
      ]
     },
     "execution_count": 504,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "expand_trig(cos(3*x))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 506,
   "id": "6d8cf082",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\left[\\begin{matrix}\\cos{\\left(x \\right)} & - \\sin{\\left(x \\right)}\\\\\\sin{\\left(x \\right)} & \\cos{\\left(x \\right)}\\end{matrix}\\right]$"
      ],
      "text/plain": [
       "Matrix([\n",
       "[cos(x), -sin(x)],\n",
       "[sin(x),  cos(x)]])"
      ]
     },
     "execution_count": 506,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "A=Matrix([[cos(x),-sin(x)],[sin(x),cos(x)]])\n",
    "A"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 507,
   "id": "a4f617f9",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\left[\\begin{matrix}\\cos{\\left(x \\right)}\\\\\\sin{\\left(x \\right)}\\end{matrix}\\right]$"
      ],
      "text/plain": [
       "Matrix([\n",
       "[cos(x)],\n",
       "[sin(x)]])"
      ]
     },
     "execution_count": 507,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "b=Matrix([cos(x),sin(x)])\n",
    "b"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 508,
   "id": "ede0b0ce",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\left[\\begin{matrix}- \\sin^{2}{\\left(x \\right)} + \\cos^{2}{\\left(x \\right)}\\\\2 \\sin{\\left(x \\right)} \\cos{\\left(x \\right)}\\end{matrix}\\right]$"
      ],
      "text/plain": [
       "Matrix([\n",
       "[-sin(x)**2 + cos(x)**2],\n",
       "[       2*sin(x)*cos(x)]])"
      ]
     },
     "execution_count": 508,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "A*b"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 509,
   "id": "b7a586e4",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\left[\\begin{matrix}\\left(- \\sin^{2}{\\left(x \\right)} + \\cos^{2}{\\left(x \\right)}\\right) \\cos{\\left(x \\right)} - 2 \\sin^{2}{\\left(x \\right)} \\cos{\\left(x \\right)}\\\\\\left(- \\sin^{2}{\\left(x \\right)} + \\cos^{2}{\\left(x \\right)}\\right) \\sin{\\left(x \\right)} + 2 \\sin{\\left(x \\right)} \\cos^{2}{\\left(x \\right)}\\end{matrix}\\right]$"
      ],
      "text/plain": [
       "Matrix([\n",
       "[(-sin(x)**2 + cos(x)**2)*cos(x) - 2*sin(x)**2*cos(x)],\n",
       "[(-sin(x)**2 + cos(x)**2)*sin(x) + 2*sin(x)*cos(x)**2]])"
      ]
     },
     "execution_count": 509,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "A**2*b"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 510,
   "id": "78c49482",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle - 4 \\sin^{3}{\\left(x \\right)} + 3 \\sin{\\left(x \\right)}$"
      ],
      "text/plain": [
       "-4*sin(x)**3 + 3*sin(x)"
      ]
     },
     "execution_count": 510,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "expand_trig(sin(3*x))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 511,
   "id": "fb3171bb",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle 8 \\cos^{4}{\\left(x \\right)} - 8 \\cos^{2}{\\left(x \\right)} + 1$"
      ],
      "text/plain": [
       "8*cos(x)**4 - 8*cos(x)**2 + 1"
      ]
     },
     "execution_count": 511,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "expand_trig(cos(4*x))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 512,
   "id": "4d352f65",
   "metadata": {},
   "outputs": [],
   "source": [
    "expr=line_and_quadratic_function(y-k*x-1,y**2-4*x)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 513,
   "id": "a7a67d54",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle k^{2} x^{2} + x \\left(2 k - 4\\right) + 1$"
      ],
      "text/plain": [
       "k**2*x**2 + x*(2*k - 4) + 1"
      ]
     },
     "execution_count": 513,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "expr"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 514,
   "id": "8ee2d4f9",
   "metadata": {},
   "outputs": [],
   "source": [
    "q=quadratic_function(expr)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 516,
   "id": "9617a900",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle 16 - 16 k$"
      ],
      "text/plain": [
       "16 - 16*k"
      ]
     },
     "execution_count": 516,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "simplify(q.delta)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 518,
   "id": "4d0716d8",
   "metadata": {},
   "outputs": [],
   "source": [
    "p=symbols(\"p\",positive=True)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 519,
   "id": "973abbb0",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\operatorname{Line2D}\\left(\\operatorname{Point2D}\\left(- \\frac{3 p}{2}, p\\right), \\operatorname{Point2D}\\left(1 - \\frac{3 p}{2}, k + p\\right)\\right)$"
      ],
      "text/plain": [
       "Line2D(Point2D(-3*p/2, p), Point2D(1 - 3*p/2, k + p))"
      ]
     },
     "execution_count": 519,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "l=Line(Point(-3*p/2,p),slope=k)\n",
    "l"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 520,
   "id": "37a56d69",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle - k x + \\frac{p \\left(- 3 k - 2\\right)}{2} + y$"
      ],
      "text/plain": [
       "-k*x + p*(-3*k - 2)/2 + y"
      ]
     },
     "execution_count": 520,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "l.equation()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 522,
   "id": "c2107032",
   "metadata": {},
   "outputs": [],
   "source": [
    "para=Parabola(Point(p/2,0),Line(x+p/2))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 523,
   "id": "ded1cc4f",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle 2 p x - y^{2}$"
      ],
      "text/plain": [
       "2*p*x - y**2"
      ]
     },
     "execution_count": 523,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "para.equation()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 528,
   "id": "9da76cfb",
   "metadata": {
    "scrolled": true
   },
   "outputs": [],
   "source": [
    "expr=line_and_parabola_quadratic(l,para,first=False)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 529,
   "id": "7be63d58",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle 3 k p^{2} + k y^{2} + 2 p^{2} - 2 p y$"
      ],
      "text/plain": [
       "3*k*p**2 + k*y**2 + 2*p**2 - 2*p*y"
      ]
     },
     "execution_count": 529,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "expr"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 531,
   "id": "d9b9b64c",
   "metadata": {},
   "outputs": [],
   "source": [
    "q=quadratic_function(expr,x=y)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 535,
   "id": "d74f4c8d",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle k y^{2} + p^{2} \\cdot \\left(3 k + 2\\right) - 2 p y$"
      ],
      "text/plain": [
       "k*y**2 + p**2*(3*k + 2) - 2*p*y"
      ]
     },
     "execution_count": 535,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "q.equation(y)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 536,
   "id": "ad849bcf",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle - 4 k p^{2} \\cdot \\left(3 k + 2\\right) + 4 p^{2}$"
      ],
      "text/plain": [
       "-4*k*p**2*(3*k + 2) + 4*p**2"
      ]
     },
     "execution_count": 536,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "q.delta"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 537,
   "id": "f8901546",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\mathbb{R} \\cap \\left\\{- \\frac{p \\sqrt{- \\left(k + 1\\right) \\left(3 k - 1\\right)}}{k} + \\frac{p}{k}, \\frac{p \\sqrt{- \\left(k + 1\\right) \\left(3 k - 1\\right)}}{k} + \\frac{p}{k}\\right\\}$"
      ],
      "text/plain": [
       "Intersection({-p*sqrt(-(k + 1)*(3*k - 1))/k + p/k, p*sqrt(-(k + 1)*(3*k - 1))/k + p/k}, Reals)"
      ]
     },
     "execution_count": 537,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "q.roots"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 538,
   "id": "f6f62074",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\frac{p}{2} + x + y$"
      ],
      "text/plain": [
       "p/2 + x + y"
      ]
     },
     "execution_count": 538,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "l.equation().subs(k,-1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 539,
   "id": "d784af4b",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle - \\frac{3 p}{2} - \\frac{x}{3} + y$"
      ],
      "text/plain": [
       "-3*p/2 - x/3 + y"
      ]
     },
     "execution_count": 539,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "l.equation().subs(k,Rational(1,3))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 541,
   "id": "a80d8cc3",
   "metadata": {},
   "outputs": [],
   "source": [
    "l=Line(Point(4,1),slope=k)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 542,
   "id": "01d209da",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle - k x + 4 k + y - 1$"
      ],
      "text/plain": [
       "-k*x + 4*k + y - 1"
      ]
     },
     "execution_count": 542,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "l.equation()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 543,
   "id": "69772f3a",
   "metadata": {},
   "outputs": [],
   "source": [
    "para=Parabola(Point(2,0),Line(x+2))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 545,
   "id": "b1d92caa",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle 8 x - y^{2}$"
      ],
      "text/plain": [
       "8*x - y**2"
      ]
     },
     "execution_count": 545,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "para.equation()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 546,
   "id": "175c2ddf",
   "metadata": {},
   "outputs": [],
   "source": [
    "expr=line_and_parabola_quadratic(l,para,first=False)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 547,
   "id": "27b37a8f",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle k y^{2} - 32 k - 8 y + 8$"
      ],
      "text/plain": [
       "k*y**2 - 32*k - 8*y + 8"
      ]
     },
     "execution_count": 547,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "expr"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 548,
   "id": "e839cfb4",
   "metadata": {},
   "outputs": [],
   "source": [
    "q=quadratic_function(expr,x=y)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 551,
   "id": "ea2f0430",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle - 4 k \\left(8 - 32 k\\right) + 64$"
      ],
      "text/plain": [
       "-4*k*(8 - 32*k) + 64"
      ]
     },
     "execution_count": 551,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "q.delta"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 550,
   "id": "c7e09823",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle 62$"
      ],
      "text/plain": [
       "62"
      ]
     },
     "execution_count": 550,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "quadratic_function(q.delta,x=k).extreme_value"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 552,
   "id": "24eb99ee",
   "metadata": {},
   "outputs": [],
   "source": [
    "para=Parabola(Point(-1,0),Line(x-1))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 553,
   "id": "faead4b5",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle - 4 x - y^{2}$"
      ],
      "text/plain": [
       "-4*x - y**2"
      ]
     },
     "execution_count": 553,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "para.equation()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 554,
   "id": "65fd0c52",
   "metadata": {},
   "outputs": [],
   "source": [
    "l=Line(Point(-1,0),slope=k)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 556,
   "id": "9b666ea6",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle - k x - k + y$"
      ],
      "text/plain": [
       "-k*x - k + y"
      ]
     },
     "execution_count": 556,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "\n",
    "l.equation()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 557,
   "id": "45b79007",
   "metadata": {},
   "outputs": [],
   "source": [
    "P,Q=Intersection(l,para)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 558,
   "id": "34bec88e",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\operatorname{Point2D}\\left(\\frac{- k - \\frac{2 \\sqrt{k^{2} + 1}}{k} - \\frac{2}{k}}{k}, - \\frac{2 \\sqrt{k^{2} + 1}}{k} - \\frac{2}{k}\\right)$"
      ],
      "text/plain": [
       "Point2D((-k - 2*sqrt(k**2 + 1)/k - 2/k)/k, -2*sqrt(k**2 + 1)/k - 2/k)"
      ]
     },
     "execution_count": 558,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "P"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 559,
   "id": "0410f542",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\operatorname{Point2D}\\left(\\frac{- k + \\frac{2 \\sqrt{k^{2} + 1}}{k} - \\frac{2}{k}}{k}, \\frac{2 \\sqrt{k^{2} + 1}}{k} - \\frac{2}{k}\\right)$"
      ],
      "text/plain": [
       "Point2D((-k + 2*sqrt(k**2 + 1)/k - 2/k)/k, 2*sqrt(k**2 + 1)/k - 2/k)"
      ]
     },
     "execution_count": 559,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "Q"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 562,
   "id": "e2e60539",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle 4 \\sqrt{\\frac{\\left(k^{2} + 1\\right)^{2}}{k^{4}}}$"
      ],
      "text/plain": [
       "4*sqrt((k**2 + 1)**2/k**4)"
      ]
     },
     "execution_count": 562,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "simplify(P.distance(Q))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 563,
   "id": "a7a0f82d",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\left\\{-1, 1\\right\\}$"
      ],
      "text/plain": [
       "{-1, 1}"
      ]
     },
     "execution_count": 563,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "solveset(_-8,k,Reals)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 564,
   "id": "2164e04d",
   "metadata": {},
   "outputs": [],
   "source": [
    "expr=line_and_parabola_quadratic(l,para)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 565,
   "id": "f4d85c5e",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle - k^{2} x^{2} - k^{2} + x \\left(- 2 k^{2} - 4\\right)$"
      ],
      "text/plain": [
       "-k**2*x**2 - k**2 + x*(-2*k**2 - 4)"
      ]
     },
     "execution_count": 565,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "expr"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 566,
   "id": "947fb125",
   "metadata": {},
   "outputs": [],
   "source": [
    "para=Parabola(Point(0,Rational(1,2)),Line(y+Rational(1,2)))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 568,
   "id": "ab6d0367",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle - x^{2} + 2 y$"
      ],
      "text/plain": [
       "-x**2 + 2*y"
      ]
     },
     "execution_count": 568,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "para.equation()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 574,
   "id": "4f946a1a",
   "metadata": {},
   "outputs": [],
   "source": [
    "l=Line(y-k*x-1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 575,
   "id": "36b40fe7",
   "metadata": {},
   "outputs": [],
   "source": [
    "A,B=Intersection(l,para)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 576,
   "id": "9f8e3da3",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\sqrt{4 k^{2} \\left(k^{2} + 2\\right) + \\left(- \\frac{k^{2} - k \\sqrt{k^{2} + 2}}{k} + \\frac{k^{2} + k \\sqrt{k^{2} + 2}}{k}\\right)^{2}}$"
      ],
      "text/plain": [
       "sqrt(4*k**2*(k**2 + 2) + (-(k**2 - k*sqrt(k**2 + 2))/k + (k**2 + k*sqrt(k**2 + 2))/k)**2)"
      ]
     },
     "execution_count": 576,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "A.distance(B)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 577,
   "id": "c865334c",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle 2 \\sqrt{k^{4} + 3 k^{2} + 2}$"
      ],
      "text/plain": [
       "2*sqrt(k**4 + 3*k**2 + 2)"
      ]
     },
     "execution_count": 577,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "simplify(_)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 578,
   "id": "2dd34347",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\left\\{-1, 1\\right\\}$"
      ],
      "text/plain": [
       "{-1, 1}"
      ]
     },
     "execution_count": 578,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "solveset(_-2*sqrt(6),k,Reals)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 581,
   "id": "3874aa91",
   "metadata": {},
   "outputs": [],
   "source": [
    "expr=line_and_parabola_quadratic(l,para)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 582,
   "id": "5f3c63bd",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle 2 k x - x^{2} + 2$"
      ],
      "text/plain": [
       "2*k*x - x**2 + 2"
      ]
     },
     "execution_count": 582,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "expr"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 583,
   "id": "c173a92c",
   "metadata": {},
   "outputs": [],
   "source": [
    "expr=line_and_quadratic_function(2*x-y+m,y-x**2)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 584,
   "id": "2e720c7c",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle m - x^{2} + 2 x$"
      ],
      "text/plain": [
       "m - x**2 + 2*x"
      ]
     },
     "execution_count": 584,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "expr"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 585,
   "id": "05a47181",
   "metadata": {},
   "outputs": [],
   "source": [
    "para=Parabola(Point(2,0),Line(x+1))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 586,
   "id": "45d6706a",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle 6 x - y^{2} - 3$"
      ],
      "text/plain": [
       "6*x - y**2 - 3"
      ]
     },
     "execution_count": 586,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "para.equation()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 587,
   "id": "44e34ca3",
   "metadata": {},
   "outputs": [],
   "source": [
    "expr=line_and_quadratic_function(y-k*(x-3),y**2-12*x)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 588,
   "id": "c1509008",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle k^{2} x^{2} + 9 k^{2} + x \\left(- 6 k^{2} - 12\\right)$"
      ],
      "text/plain": [
       "k**2*x**2 + 9*k**2 + x*(-6*k**2 - 12)"
      ]
     },
     "execution_count": 588,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "expr"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 589,
   "id": "49cf26ae",
   "metadata": {},
   "outputs": [],
   "source": [
    "l=Line(y-k*x-1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 590,
   "id": "aa7d2c6b",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle - k x + y - 1$"
      ],
      "text/plain": [
       "-k*x + y - 1"
      ]
     },
     "execution_count": 590,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "l.equation()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 592,
   "id": "c335b641",
   "metadata": {},
   "outputs": [],
   "source": [
    "para=Parabola(Point(0,1),Line(y+1))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 594,
   "id": "4e3e5d44",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle - x^{2} + 4 y$"
      ],
      "text/plain": [
       "-x**2 + 4*y"
      ]
     },
     "execution_count": 594,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "para.equation()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 595,
   "id": "65646e1d",
   "metadata": {},
   "outputs": [],
   "source": [
    "A,B=Intersection(l,para)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 596,
   "id": "57bde523",
   "metadata": {},
   "outputs": [],
   "source": [
    "M=Point(-2,1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 597,
   "id": "4081815a",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\operatorname{Point2D}\\left(- 2 k + 2 \\sqrt{k^{2} + 1} - 2, 2 k \\left(- k + \\sqrt{k^{2} + 1}\\right)\\right)$"
      ],
      "text/plain": [
       "Point2D(-2*k + 2*sqrt(k**2 + 1) - 2, 2*k*(-k + sqrt(k**2 + 1)))"
      ]
     },
     "execution_count": 597,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "M-A"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 598,
   "id": "f09c1981",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\operatorname{Point2D}\\left(- 2 k - 2 \\sqrt{k^{2} + 1} - 2, 2 k \\left(- k - \\sqrt{k^{2} + 1}\\right)\\right)$"
      ],
      "text/plain": [
       "Point2D(-2*k - 2*sqrt(k**2 + 1) - 2, 2*k*(-k - sqrt(k**2 + 1)))"
      ]
     },
     "execution_count": 598,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "M-B"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 599,
   "id": "e80f6e33",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle 4 k^{2} \\left(- k - \\sqrt{k^{2} + 1}\\right) \\left(- k + \\sqrt{k^{2} + 1}\\right) + \\left(- 2 k - 2 \\sqrt{k^{2} + 1} - 2\\right) \\left(- 2 k + 2 \\sqrt{k^{2} + 1} - 2\\right)$"
      ],
      "text/plain": [
       "4*k**2*(-k - sqrt(k**2 + 1))*(-k + sqrt(k**2 + 1)) + (-2*k - 2*sqrt(k**2 + 1) - 2)*(-2*k + 2*sqrt(k**2 + 1) - 2)"
      ]
     },
     "execution_count": 599,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "(M-A).x*(M-B).x+(M-A).y*(M-B).y"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 600,
   "id": "e1c36609",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle 4 k \\left(2 - k\\right)$"
      ],
      "text/plain": [
       "4*k*(2 - k)"
      ]
     },
     "execution_count": 600,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "simplify(_)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 601,
   "id": "aea6e037",
   "metadata": {},
   "outputs": [],
   "source": [
    "expr=line_and_parabola_quadratic(l,para)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 602,
   "id": "75350c98",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle 4 k x - x^{2} + 4$"
      ],
      "text/plain": [
       "4*k*x - x**2 + 4"
      ]
     },
     "execution_count": 602,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "expr"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 603,
   "id": "43e01189",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle - k x + y - 1$"
      ],
      "text/plain": [
       "-k*x + y - 1"
      ]
     },
     "execution_count": 603,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "l.equation()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 604,
   "id": "261e66ee",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle - k x + k + y$"
      ],
      "text/plain": [
       "-k*x + k + y"
      ]
     },
     "execution_count": 604,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "l=Line(y-k*(x-1))\n",
    "l.equation()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 612,
   "id": "b73f9e06",
   "metadata": {},
   "outputs": [],
   "source": [
    "para=Parabola(Point(0,Rational(-15,4)),Line(y+Rational(17,4)))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 613,
   "id": "21a25b0e",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle - x^{2} + y + 4$"
      ],
      "text/plain": [
       "-x**2 + y + 4"
      ]
     },
     "execution_count": 613,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "para.equation()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 614,
   "id": "c575c652",
   "metadata": {},
   "outputs": [],
   "source": [
    "M,N=Intersection(para,l)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 615,
   "id": "b593a041",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\sqrt{k^{2} \\left(k^{2} - 4 k + 16\\right) + \\left(\\frac{\\frac{k \\left(k - 2\\right)}{2} - \\frac{k \\sqrt{k^{2} - 4 k + 16}}{2} + k}{k} - \\frac{\\frac{k \\left(k - 2\\right)}{2} + \\frac{k \\sqrt{k^{2} - 4 k + 16}}{2} + k}{k}\\right)^{2}}$"
      ],
      "text/plain": [
       "sqrt(k**2*(k**2 - 4*k + 16) + ((k*(k - 2)/2 - k*sqrt(k**2 - 4*k + 16)/2 + k)/k - (k*(k - 2)/2 + k*sqrt(k**2 - 4*k + 16)/2 + k)/k)**2)"
      ]
     },
     "execution_count": 615,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "M.distance(N)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 616,
   "id": "28a1749a",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\sqrt{k^{4} - 4 k^{3} + 17 k^{2} - 4 k + 16}$"
      ],
      "text/plain": [
       "sqrt(k**4 - 4*k**3 + 17*k**2 - 4*k + 16)"
      ]
     },
     "execution_count": 616,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "simplify(_)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 617,
   "id": "2d5e171e",
   "metadata": {},
   "outputs": [],
   "source": [
    "expr=factor(_)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 618,
   "id": "7ae7aa04",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\sqrt{\\left(k^{2} + 1\\right) \\left(k^{2} - 4 k + 16\\right)}$"
      ],
      "text/plain": [
       "sqrt((k**2 + 1)*(k**2 - 4*k + 16))"
      ]
     },
     "execution_count": 618,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "\n",
    "expr"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 619,
   "id": "1b6415a1",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle x^{2} + \\left(y - 1\\right)^{2} - 5$"
      ],
      "text/plain": [
       "x**2 + (y - 1)**2 - 5"
      ]
     },
     "execution_count": 619,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "c1=Circle(x**2+y**2-2*y-4)\n",
    "c1.equation()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 620,
   "id": "4cc05250",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\left(x - 2\\right)^{2} + \\left(y + 1\\right)^{2} - 5$"
      ],
      "text/plain": [
       "(x - 2)**2 + (y + 1)**2 - 5"
      ]
     },
     "execution_count": 620,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "c2=Circle(x**2+y**2-4*x+2*y)\n",
    "c2.equation()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 621,
   "id": "745e8037",
   "metadata": {},
   "outputs": [],
   "source": [
    "A,B=Intersection(c1,c2)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 622,
   "id": "f15d5ccf",
   "metadata": {},
   "outputs": [],
   "source": [
    "l=Segment(A,B).perpendicular_bisector()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 624,
   "id": "7d68c503",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle - \\sqrt{6} \\left(x + y - 1\\right)$"
      ],
      "text/plain": [
       "-sqrt(6)*(x + y - 1)"
      ]
     },
     "execution_count": 624,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "factor(l.equation())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 625,
   "id": "aa9378d0",
   "metadata": {},
   "outputs": [],
   "source": [
    "l1=Line(2*x+4*y-1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 627,
   "id": "82ae5f21",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\operatorname{Point2D}\\left(\\frac{3}{2}, - \\frac{1}{2}\\right)$"
      ],
      "text/plain": [
       "Point2D(3/2, -1/2)"
      ]
     },
     "execution_count": 627,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "point=list(Intersection(l,l1))[0]\n",
    "point"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 629,
   "id": "e74e2ad7",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\frac{\\sqrt{14}}{2}$"
      ],
      "text/plain": [
       "sqrt(14)/2"
      ]
     },
     "execution_count": 629,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "simplify(A.distance(point))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 630,
   "id": "169d8f72",
   "metadata": {},
   "outputs": [],
   "source": [
    "c=Circle(point,A.distance(point))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 631,
   "id": "fbeb397c",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\left(x - \\frac{3}{2}\\right)^{2} + \\left(y + \\frac{1}{2}\\right)^{2} - \\left(- \\frac{\\sqrt{6}}{2} - \\frac{1}{2}\\right)^{2} - \\left(\\frac{1}{2} - \\frac{\\sqrt{6}}{2}\\right)^{2}$"
      ],
      "text/plain": [
       "(x - 3/2)**2 + (y + 1/2)**2 - (-sqrt(6)/2 - 1/2)**2 - (1/2 - sqrt(6)/2)**2"
      ]
     },
     "execution_count": 631,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "c.equation()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 632,
   "id": "92a3e755",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle x^{2} - 3 x + y^{2} + y - 1$"
      ],
      "text/plain": [
       "x**2 - 3*x + y**2 + y - 1"
      ]
     },
     "execution_count": 632,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "expand(c.equation())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 633,
   "id": "0fffd83f",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "448.00000000000006"
      ]
     },
     "execution_count": 633,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "0.14*(4000-800)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 634,
   "id": "14f7dcbb",
   "metadata": {},
   "outputs": [],
   "source": [
    "q=quadratic_function(8,-4,S(5))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 635,
   "id": "5eb3609f",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle 8 \\left(x - 0.25\\right)^{2} + \\frac{9}{2}$"
      ],
      "text/plain": [
       "8*(x - 0.25)**2 + 9/2"
      ]
     },
     "execution_count": 635,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "q.symmetry_equation()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 636,
   "id": "719ea656",
   "metadata": {
    "collapsed": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Help on function fraction in module sympy.simplify.radsimp:\n",
      "\n",
      "fraction(expr, exact=False)\n",
      "    Returns a pair with expression's numerator and denominator.\n",
      "    If the given expression is not a fraction then this function\n",
      "    will return the tuple (expr, 1).\n",
      "    \n",
      "    This function will not make any attempt to simplify nested\n",
      "    fractions or to do any term rewriting at all.\n",
      "    \n",
      "    If only one of the numerator/denominator pair is needed then\n",
      "    use numer(expr) or denom(expr) functions respectively.\n",
      "    \n",
      "    >>> from sympy import fraction, Rational, Symbol\n",
      "    >>> from sympy.abc import x, y\n",
      "    \n",
      "    >>> fraction(x/y)\n",
      "    (x, y)\n",
      "    >>> fraction(x)\n",
      "    (x, 1)\n",
      "    \n",
      "    >>> fraction(1/y**2)\n",
      "    (1, y**2)\n",
      "    \n",
      "    >>> fraction(x*y/2)\n",
      "    (x*y, 2)\n",
      "    >>> fraction(Rational(1, 2))\n",
      "    (1, 2)\n",
      "    \n",
      "    This function will also work fine with assumptions:\n",
      "    \n",
      "    >>> k = Symbol('k', negative=True)\n",
      "    >>> fraction(x * y**k)\n",
      "    (x, y**(-k))\n",
      "    \n",
      "    If we know nothing about sign of some exponent and ``exact``\n",
      "    flag is unset, then structure this exponent's structure will\n",
      "    be analyzed and pretty fraction will be returned:\n",
      "    \n",
      "    >>> from sympy import exp, Mul\n",
      "    >>> fraction(2*x**(-y))\n",
      "    (2, x**y)\n",
      "    \n",
      "    >>> fraction(exp(-x))\n",
      "    (1, exp(x))\n",
      "    \n",
      "    >>> fraction(exp(-x), exact=True)\n",
      "    (exp(-x), 1)\n",
      "    \n",
      "    The ``exact`` flag will also keep any unevaluated Muls from\n",
      "    being evaluated:\n",
      "    \n",
      "    >>> u = Mul(2, x + 1, evaluate=False)\n",
      "    >>> fraction(u)\n",
      "    (2*x + 2, 1)\n",
      "    >>> fraction(u, exact=True)\n",
      "    (2*(x  + 1), 1)\n",
      "\n"
     ]
    }
   ],
   "source": [
    "help(fraction)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 639,
   "id": "7f6664d5",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle 5 \\left|{5 x - 3}\\right| = \\sqrt{10 x^{2} + 15 \\left(x - 1\\right)^{2}}$"
      ],
      "text/plain": [
       "Eq(5*Abs(5*x - 3), sqrt(10*x**2 + 15*(x - 1)**2))"
      ]
     },
     "execution_count": 639,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "eq=Eq(5*abs(2*x+3*(x-1)),sqrt(5*(2*x**2+(x-1)**2*3)))\n",
    "eq"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 640,
   "id": "5a7024bf",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\left\\{\\frac{1}{2}, \\frac{7}{10}\\right\\}$"
      ],
      "text/plain": [
       "{1/2, 7/10}"
      ]
     },
     "execution_count": 640,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "solveset(eq,x,Reals)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 641,
   "id": "2614277e",
   "metadata": {},
   "outputs": [],
   "source": [
    "q=quadratic_function(Rational(3,2),-2,1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 642,
   "id": "5d0d9fd8",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\frac{1}{3}$"
      ],
      "text/plain": [
       "1/3"
      ]
     },
     "execution_count": 642,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "q.extreme_value"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 643,
   "id": "b72dbd2a",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\frac{3 \\left(x - \\frac{2}{3}\\right)^{2}}{2} + \\frac{1}{3}$"
      ],
      "text/plain": [
       "3*(x - 2/3)**2/2 + 1/3"
      ]
     },
     "execution_count": 643,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "q.symmetry_equation()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 644,
   "id": "103f0e32",
   "metadata": {},
   "outputs": [],
   "source": [
    "expr=x**2+(6-2*x)**2+3*(x-2)**2"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 645,
   "id": "6276d46b",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle x^{2} + \\left(6 - 2 x\\right)^{2} + 3 \\left(x - 2\\right)^{2}$"
      ],
      "text/plain": [
       "x**2 + (6 - 2*x)**2 + 3*(x - 2)**2"
      ]
     },
     "execution_count": 645,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "expr"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 646,
   "id": "5dfe4627",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle 8 x^{2} - 36 x + 48$"
      ],
      "text/plain": [
       "8*x**2 - 36*x + 48"
      ]
     },
     "execution_count": 646,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "expand(expr)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 647,
   "id": "81537766",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/plain": [
       "<sympy.plotting.plot.Plot at 0x7f26692b4f40>"
      ]
     },
     "execution_count": 647,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "plot(expr,(x,2,3))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 650,
   "id": "fe2404ca",
   "metadata": {},
   "outputs": [],
   "source": [
    "q=quadratic_function(expr)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 651,
   "id": "85dfc337",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle 8 \\left(x - \\frac{9}{4}\\right)^{2} + \\frac{15}{2}$"
      ],
      "text/plain": [
       "8*(x - 9/4)**2 + 15/2"
      ]
     },
     "execution_count": 651,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "q.symmetry_equation()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 652,
   "id": "a31a4a87",
   "metadata": {},
   "outputs": [],
   "source": [
    "q=quadratic_function(48,-36,8)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 653,
   "id": "ec7b8397",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle 48 \\left(x - 0.375\\right)^{2} + 1.25$"
      ],
      "text/plain": [
       "48*(x - 0.375)**2 + 1.25"
      ]
     },
     "execution_count": 653,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "q.symmetry_equation()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 699,
   "id": "a23cb100",
   "metadata": {},
   "outputs": [],
   "source": [
    "h=Hyperbola(Point(0,0),2,2,)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 700,
   "id": "5ff94554",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "False"
      ]
     },
     "execution_count": 700,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "h.slope==oo"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 701,
   "id": "d90100d9",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\frac{x^{2}}{4} - \\frac{y^{2}}{4} - 1$"
      ],
      "text/plain": [
       "x**2/4 - y**2/4 - 1"
      ]
     },
     "execution_count": 701,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "expand(h.equation())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 702,
   "id": "cc18e7a1",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\left\\{\\left( 1, \\  4\\right), \\left( 2, \\  2\\right)\\right\\}$"
      ],
      "text/plain": [
       "{(1, 4), (2, 2)}"
      ]
     },
     "execution_count": 702,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "nonlinsolve([x+y/2-3,2*y*x-8],[x,y])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 703,
   "id": "cd9f3803",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\left\\{\\left( \\frac{1}{2}, \\  9\\right), \\left( \\frac{9}{2}, \\  1\\right)\\right\\}$"
      ],
      "text/plain": [
       "{(1/2, 9), (9/2, 1)}"
      ]
     },
     "execution_count": 703,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "nonlinsolve([x+y/2-5,2*y*x-9],[x,y])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 704,
   "id": "6a881e9b",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/svg+xml": [
       "<svg xmlns=\"http://www.w3.org/2000/svg\"\n",
       "            xmlns:xlink=\"http://www.w3.org/1999/xlink\"\n",
       "            width=\"100.0\" height=\"100.0\" viewBox=\"-0.250000000000000 -1.50000000000000 3.00000000000000 3.00000000000000\"\n",
       "            preserveAspectRatio=\"xMinYMin meet\">\n",
       "            <defs>\n",
       "                <marker id=\"markerCircle\" markerWidth=\"8\" markerHeight=\"8\"\n",
       "                    refx=\"5\" refy=\"5\" markerUnits=\"strokeWidth\">\n",
       "                    <circle cx=\"5\" cy=\"5\" r=\"1.5\" style=\"stroke: none; fill:#000000;\"/>\n",
       "                </marker>\n",
       "                <marker id=\"markerArrow\" markerWidth=\"13\" markerHeight=\"13\" refx=\"2\" refy=\"4\"\n",
       "                       orient=\"auto\" markerUnits=\"strokeWidth\">\n",
       "                    <path d=\"M2,2 L2,6 L6,4\" style=\"fill: #000000;\" />\n",
       "                </marker>\n",
       "                <marker id=\"markerReverseArrow\" markerWidth=\"13\" markerHeight=\"13\" refx=\"6\" refy=\"4\"\n",
       "                       orient=\"auto\" markerUnits=\"strokeWidth\">\n",
       "                    <path d=\"M6,2 L6,6 L2,4\" style=\"fill: #000000;\" />\n",
       "                </marker>\n",
       "            </defs><g transform=\"matrix(1,0,0,-1,0,0)\"><ellipse fill=\"#66cc99\" stroke=\"#555555\" stroke-width=\"0.0600000000000000\" opacity=\"0.6\" cx=\"1.25000000000000\" cy=\"0\" rx=\"1.25000000000000\" ry=\"1.25000000000000\"/></g></svg>"
      ],
      "text/latex": [
       "$\\displaystyle \\operatorname{Circle}\\left(\\operatorname{Point2D}\\left(\\frac{5}{4}, 0\\right), \\frac{5}{4}\\right)$"
      ],
      "text/plain": [
       "Circle(Point2D(5/4, 0), 5/4)"
      ]
     },
     "execution_count": 704,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "c=Circle(Point(Rational(5,4),0),Rational(5,4))\n",
    "c"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 705,
   "id": "be357c02",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "True"
      ]
     },
     "execution_count": 705,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "Point(2,1) in c"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 706,
   "id": "d64f211b",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\left\\{\\left( 1, \\  8\\right), \\left( 4, \\  2\\right)\\right\\}$"
      ],
      "text/plain": [
       "{(1, 8), (4, 2)}"
      ]
     },
     "execution_count": 706,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "nonlinsolve([x+y/2-5,2*y*x-16],[x,y])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 707,
   "id": "604cef22",
   "metadata": {},
   "outputs": [],
   "source": [
    "c=Circle(x**2+y**2-2*x-4)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 708,
   "id": "c223d774",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/svg+xml": [
       "<svg xmlns=\"http://www.w3.org/2000/svg\"\n",
       "            xmlns:xlink=\"http://www.w3.org/1999/xlink\"\n",
       "            width=\"100.0\" height=\"100.0\" viewBox=\"-1.68328157299975 -2.68328157299975 5.36656314599950 5.36656314599950\"\n",
       "            preserveAspectRatio=\"xMinYMin meet\">\n",
       "            <defs>\n",
       "                <marker id=\"markerCircle\" markerWidth=\"8\" markerHeight=\"8\"\n",
       "                    refx=\"5\" refy=\"5\" markerUnits=\"strokeWidth\">\n",
       "                    <circle cx=\"5\" cy=\"5\" r=\"1.5\" style=\"stroke: none; fill:#000000;\"/>\n",
       "                </marker>\n",
       "                <marker id=\"markerArrow\" markerWidth=\"13\" markerHeight=\"13\" refx=\"2\" refy=\"4\"\n",
       "                       orient=\"auto\" markerUnits=\"strokeWidth\">\n",
       "                    <path d=\"M2,2 L2,6 L6,4\" style=\"fill: #000000;\" />\n",
       "                </marker>\n",
       "                <marker id=\"markerReverseArrow\" markerWidth=\"13\" markerHeight=\"13\" refx=\"6\" refy=\"4\"\n",
       "                       orient=\"auto\" markerUnits=\"strokeWidth\">\n",
       "                    <path d=\"M6,2 L6,6 L2,4\" style=\"fill: #000000;\" />\n",
       "                </marker>\n",
       "            </defs><g transform=\"matrix(1,0,0,-1,0,0)\"><ellipse fill=\"#66cc99\" stroke=\"#555555\" stroke-width=\"0.107331262919990\" opacity=\"0.6\" cx=\"1.00000000000000\" cy=\"0\" rx=\"2.23606797749979\" ry=\"2.23606797749979\"/></g></svg>"
      ],
      "text/latex": [
       "$\\displaystyle \\operatorname{Circle}\\left(\\operatorname{Point2D}\\left(1, 0\\right), \\sqrt{5}\\right)$"
      ],
      "text/plain": [
       "Circle(Point2D(1, 0), sqrt(5))"
      ]
     },
     "execution_count": 708,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "c"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 711,
   "id": "f837ef8f",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/svg+xml": [
       "<svg xmlns=\"http://www.w3.org/2000/svg\"\n",
       "            xmlns:xlink=\"http://www.w3.org/1999/xlink\"\n",
       "            width=\"100.0\" height=\"100.0\" viewBox=\"-0.200000000000000 7.80000000000000 1.40000000000000 2.40000000000000\"\n",
       "            preserveAspectRatio=\"xMinYMin meet\">\n",
       "            <defs>\n",
       "                <marker id=\"markerCircle\" markerWidth=\"8\" markerHeight=\"8\"\n",
       "                    refx=\"5\" refy=\"5\" markerUnits=\"strokeWidth\">\n",
       "                    <circle cx=\"5\" cy=\"5\" r=\"1.5\" style=\"stroke: none; fill:#000000;\"/>\n",
       "                </marker>\n",
       "                <marker id=\"markerArrow\" markerWidth=\"13\" markerHeight=\"13\" refx=\"2\" refy=\"4\"\n",
       "                       orient=\"auto\" markerUnits=\"strokeWidth\">\n",
       "                    <path d=\"M2,2 L2,6 L6,4\" style=\"fill: #000000;\" />\n",
       "                </marker>\n",
       "                <marker id=\"markerReverseArrow\" markerWidth=\"13\" markerHeight=\"13\" refx=\"6\" refy=\"4\"\n",
       "                       orient=\"auto\" markerUnits=\"strokeWidth\">\n",
       "                    <path d=\"M6,2 L6,6 L2,4\" style=\"fill: #000000;\" />\n",
       "                </marker>\n",
       "            </defs><g transform=\"matrix(1,0,0,-1,0,18.0000000000000)\"><path fill-rule=\"evenodd\" fill=\"#66cc99\" stroke=\"#555555\" stroke-width=\"0.0480000000000000\" opacity=\"0.6\" d=\"M 0,8.00000000000000 L 1.00000000000000,10.0000000000000\" marker-start=\"url(#markerReverseArrow)\" marker-end=\"url(#markerArrow)\"/></g></svg>"
      ],
      "text/latex": [
       "$\\displaystyle \\operatorname{Line2D}\\left(\\operatorname{Point2D}\\left(0, 8\\right), \\operatorname{Point2D}\\left(1, 10\\right)\\right)$"
      ],
      "text/plain": [
       "Line2D(Point2D(0, 8), Point2D(1, 10))"
      ]
     },
     "execution_count": 711,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "l=Line(2*x-y+8)\n",
    "l"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 712,
   "id": "7e30c094",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle 2 \\sqrt{5}$"
      ],
      "text/plain": [
       "2*sqrt(5)"
      ]
     },
     "execution_count": 712,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "l.distance(c.center)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 713,
   "id": "b95f0a31",
   "metadata": {},
   "outputs": [],
   "source": [
    "c=Circle(x**2+y**2+2*x-4*y+4)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 714,
   "id": "f47a8888",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/svg+xml": [
       "<svg xmlns=\"http://www.w3.org/2000/svg\"\n",
       "            xmlns:xlink=\"http://www.w3.org/1999/xlink\"\n",
       "            width=\"100.0\" height=\"100.0\" viewBox=\"-2.20000000000000 0.800000000000000 2.40000000000000 2.40000000000000\"\n",
       "            preserveAspectRatio=\"xMinYMin meet\">\n",
       "            <defs>\n",
       "                <marker id=\"markerCircle\" markerWidth=\"8\" markerHeight=\"8\"\n",
       "                    refx=\"5\" refy=\"5\" markerUnits=\"strokeWidth\">\n",
       "                    <circle cx=\"5\" cy=\"5\" r=\"1.5\" style=\"stroke: none; fill:#000000;\"/>\n",
       "                </marker>\n",
       "                <marker id=\"markerArrow\" markerWidth=\"13\" markerHeight=\"13\" refx=\"2\" refy=\"4\"\n",
       "                       orient=\"auto\" markerUnits=\"strokeWidth\">\n",
       "                    <path d=\"M2,2 L2,6 L6,4\" style=\"fill: #000000;\" />\n",
       "                </marker>\n",
       "                <marker id=\"markerReverseArrow\" markerWidth=\"13\" markerHeight=\"13\" refx=\"6\" refy=\"4\"\n",
       "                       orient=\"auto\" markerUnits=\"strokeWidth\">\n",
       "                    <path d=\"M6,2 L6,6 L2,4\" style=\"fill: #000000;\" />\n",
       "                </marker>\n",
       "            </defs><g transform=\"matrix(1,0,0,-1,0,4.00000000000000)\"><ellipse fill=\"#66cc99\" stroke=\"#555555\" stroke-width=\"0.0480000000000000\" opacity=\"0.6\" cx=\"-1.00000000000000\" cy=\"2.00000000000000\" rx=\"1.00000000000000\" ry=\"1.00000000000000\"/></g></svg>"
      ],
      "text/latex": [
       "$\\displaystyle \\operatorname{Circle}\\left(\\operatorname{Point2D}\\left(-1, 2\\right), 1\\right)$"
      ],
      "text/plain": [
       "Circle(Point2D(-1, 2), 1)"
      ]
     },
     "execution_count": 714,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "c"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 715,
   "id": "307d4c3e",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\left\\{\\frac{3}{4} - \\frac{\\sqrt{3}}{4}, \\frac{\\sqrt{3}}{4} + \\frac{3}{4}\\right\\}$"
      ],
      "text/plain": [
       "{3/4 - sqrt(3)/4, sqrt(3)/4 + 3/4}"
      ]
     },
     "execution_count": 715,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "solveset(abs(-3*k+2)/sqrt(1+k**2)-1,k,Reals)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 716,
   "id": "48475c6d",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle 4 x + 3 \\sqrt{- x^{2} - 2 x}$"
      ],
      "text/plain": [
       "4*x + 3*sqrt(-x**2 - 2*x)"
      ]
     },
     "execution_count": 716,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "expr=4*x+3*sqrt(-x**2-2*x)\n",
    "expr"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 717,
   "id": "0f6e8451",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\left[-8, 1\\right]$"
      ],
      "text/plain": [
       "Interval(-8, 1)"
      ]
     },
     "execution_count": 717,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "function_range(expr,x,Reals)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 718,
   "id": "31b8d019",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\operatorname{Line2D}\\left(\\operatorname{Point2D}\\left(0, - k t\\right), \\operatorname{Point2D}\\left(1, - k t + k\\right)\\right)$"
      ],
      "text/plain": [
       "Line2D(Point2D(0, -k*t), Point2D(1, -k*t + k))"
      ]
     },
     "execution_count": 718,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "l=Line(y-k*(x-t))\n",
    "l"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 720,
   "id": "0d18252e",
   "metadata": {},
   "outputs": [],
   "source": [
    "O=Point(0,0)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 722,
   "id": "0dcef1d3",
   "metadata": {},
   "outputs": [],
   "source": [
    "r=symbols(\"r\",positive=True)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 723,
   "id": "702b393d",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\operatorname{Circle}\\left(\\operatorname{Point2D}\\left(0, 0\\right), r\\right)$"
      ],
      "text/plain": [
       "Circle(Point2D(0, 0), r)"
      ]
     },
     "execution_count": 723,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "c=Circle(O,r)\n",
    "c"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 724,
   "id": "fdfd6123",
   "metadata": {},
   "outputs": [],
   "source": [
    "A,B=Intersection(l,c)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 725,
   "id": "7d02501d",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\operatorname{Point2D}\\left(- r, 0\\right)$"
      ],
      "text/plain": [
       "Point2D(-r, 0)"
      ]
     },
     "execution_count": 725,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "M=Point(-r,0)\n",
    "M"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 726,
   "id": "1446380c",
   "metadata": {},
   "outputs": [],
   "source": [
    "k1=Line(A,M).slope"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 728,
   "id": "4b4061b4",
   "metadata": {},
   "outputs": [],
   "source": [
    "k2=Line(B,M).slope"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 729,
   "id": "6e9cf0a9",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\frac{k \\left(- t + \\sqrt{k^{2} r^{2} - k^{2} t^{2} + r^{2}}\\right)}{k^{2} r + k^{2} t + r + \\sqrt{k^{2} r^{2} - k^{2} t^{2} + r^{2}}}$"
      ],
      "text/plain": [
       "k*(-t + sqrt(k**2*r**2 - k**2*t**2 + r**2))/(k**2*r + k**2*t + r + sqrt(k**2*r**2 - k**2*t**2 + r**2))"
      ]
     },
     "execution_count": 729,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "k1"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 730,
   "id": "bc9c44fc",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle - \\frac{k \\left(t + \\sqrt{k^{2} r^{2} - k^{2} t^{2} + r^{2}}\\right)}{k^{2} r + k^{2} t + r - \\sqrt{k^{2} r^{2} - k^{2} t^{2} + r^{2}}}$"
      ],
      "text/plain": [
       "-k*(t + sqrt(k**2*r**2 - k**2*t**2 + r**2))/(k**2*r + k**2*t + r - sqrt(k**2*r**2 - k**2*t**2 + r**2))"
      ]
     },
     "execution_count": 730,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "k2"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 732,
   "id": "9edb7cb1",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\frac{- r + t}{r + t}$"
      ],
      "text/plain": [
       "(-r + t)/(r + t)"
      ]
     },
     "execution_count": 732,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "simplify(k1*k2)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "d4dd2cd4",
   "metadata": {},
   "source": [
    "#### 微专题十"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 734,
   "id": "2e7c1cbb",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle - k x - m + y$"
      ],
      "text/plain": [
       "-k*x - m + y"
      ]
     },
     "execution_count": 734,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "l=Line(y-k*x-m)\n",
    "l.equation()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 735,
   "id": "bb7fd5a5",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\frac{x^{2}}{4} + y^{2} - 1$"
      ],
      "text/plain": [
       "x**2/4 + y**2 - 1"
      ]
     },
     "execution_count": 735,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "e=Ellipse(O,2,1)\n",
    "e.equation()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 736,
   "id": "fe067460",
   "metadata": {},
   "outputs": [],
   "source": [
    "expr=line_and_ellipse_quadratic(l,e)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 737,
   "id": "aebe3b0e",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle 8 k m x + 4 m^{2} + x^{2} \\cdot \\left(4 k^{2} + 1\\right) - 4$"
      ],
      "text/plain": [
       "8*k*m*x + 4*m**2 + x**2*(4*k**2 + 1) - 4"
      ]
     },
     "execution_count": 737,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "expr"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 739,
   "id": "fc73bbfd",
   "metadata": {},
   "outputs": [],
   "source": [
    "q=quadratic_function(expr)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 744,
   "id": "845e7395",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle 16 \\cdot \\left(4 k^{2} - m^{2} + 1\\right)$"
      ],
      "text/plain": [
       "16*(4*k**2 - m**2 + 1)"
      ]
     },
     "execution_count": 744,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "factor(simplify(expand(q.delta)))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 747,
   "id": "bb89e09e",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle - k x - m + y$"
      ],
      "text/plain": [
       "-k*x - m + y"
      ]
     },
     "execution_count": 747,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "l.equation()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 748,
   "id": "2d9eef29",
   "metadata": {},
   "outputs": [],
   "source": [
    "A,B=Intersection(l,e)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 750,
   "id": "0fa22a50",
   "metadata": {},
   "outputs": [],
   "source": [
    "M=Point(-2,0)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 751,
   "id": "ea86acbe",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\operatorname{Point2D}\\left(-2, 0\\right)$"
      ],
      "text/plain": [
       "Point2D(-2, 0)"
      ]
     },
     "execution_count": 751,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "M"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 752,
   "id": "db5822a2",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle 8 k m x + 4 m^{2} + x^{2} \\cdot \\left(4 k^{2} + 1\\right) - 4$"
      ],
      "text/plain": [
       "8*k*m*x + 4*m**2 + x**2*(4*k**2 + 1) - 4"
      ]
     },
     "execution_count": 752,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "expr"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 755,
   "id": "18e209a0",
   "metadata": {},
   "outputs": [],
   "source": [
    "x1,x2=q.roots.args[1]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 756,
   "id": "6b52723d",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\left(- \\frac{4 k m}{4 k^{2} + 1} + 2 - \\frac{2 \\sqrt{4 k^{2} - m^{2} + 1}}{4 k^{2} + 1}\\right) \\left(- \\frac{4 k m}{4 k^{2} + 1} + 2 + \\frac{2 \\sqrt{4 k^{2} - m^{2} + 1}}{4 k^{2} + 1}\\right) = \\left(k \\left(- \\frac{4 k m}{4 k^{2} + 1} - \\frac{2 \\sqrt{4 k^{2} - m^{2} + 1}}{4 k^{2} + 1}\\right) + m\\right) \\left(k \\left(- \\frac{4 k m}{4 k^{2} + 1} + \\frac{2 \\sqrt{4 k^{2} - m^{2} + 1}}{4 k^{2} + 1}\\right) + m\\right)$"
      ],
      "text/plain": [
       "Eq((-4*k*m/(4*k**2 + 1) + 2 - 2*sqrt(4*k**2 - m**2 + 1)/(4*k**2 + 1))*(-4*k*m/(4*k**2 + 1) + 2 + 2*sqrt(4*k**2 - m**2 + 1)/(4*k**2 + 1)), (k*(-4*k*m/(4*k**2 + 1) - 2*sqrt(4*k**2 - m**2 + 1)/(4*k**2 + 1)) + m)*(k*(-4*k*m/(4*k**2 + 1) + 2*sqrt(4*k**2 - m**2 + 1)/(4*k**2 + 1)) + m))"
      ]
     },
     "execution_count": 756,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "eq=Eq((x1+2)*(x2+2),(k*x1+m)*(k*x2+m))\n",
    "eq"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 762,
   "id": "251f3b1b",
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\frac{20 k^{2} - 16 k m + 3 m^{2}}{4 k^{2} + 1}$"
      ],
      "text/plain": [
       "(20*k**2 - 16*k*m + 3*m**2)/(4*k**2 + 1)"
      ]
     },
     "execution_count": 762,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "simplify(eq.lhs-eq.rhs)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 763,
   "id": "b0f8424a",
   "metadata": {},
   "outputs": [],
   "source": [
    "expr=_.args[1]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 764,
   "id": "1d079707",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle 20 k^{2} - 16 k m + 3 m^{2}$"
      ],
      "text/plain": [
       "20*k**2 - 16*k*m + 3*m**2"
      ]
     },
     "execution_count": 764,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "expr"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 765,
   "id": "8f477552",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\mathbb{R} \\cap \\left\\{2 k, \\frac{10 k}{3}\\right\\}$"
      ],
      "text/plain": [
       "Intersection({2*k, 10*k/3}, Reals)"
      ]
     },
     "execution_count": 765,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "solveset(expr,m,Reals)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 769,
   "id": "05bd1c29",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle x^{2} - \\frac{y^{2}}{3} - 1$"
      ],
      "text/plain": [
       "x**2 - y**2/3 - 1"
      ]
     },
     "execution_count": 769,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "h=Hyperbola(O,1,sqrt(3))\n",
    "h.equation()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 771,
   "id": "bfa944e0",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(Point2D(-2, 0), Point2D(2, 0))"
      ]
     },
     "execution_count": 771,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "h.foci"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 772,
   "id": "da170d13",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\operatorname{Line2D}\\left(\\operatorname{Point2D}\\left(0, 2 k\\right), \\operatorname{Point2D}\\left(1, 3 k\\right)\\right)$"
      ],
      "text/plain": [
       "Line2D(Point2D(0, 2*k), Point2D(1, 3*k))"
      ]
     },
     "execution_count": 772,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "l=Line(y-k*(x+2))\n",
    "l"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 773,
   "id": "7159f8af",
   "metadata": {},
   "outputs": [],
   "source": [
    "P,Q=Intersection(h,l)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 774,
   "id": "67fa7175",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\operatorname{Point2D}\\left(- \\frac{2 k - \\frac{3 k \\sqrt{k^{2} + 1}}{k^{2} - 3} + \\frac{6 k}{k^{2} - 3}}{k}, \\frac{3 k \\sqrt{k^{2} + 1}}{k^{2} - 3} - \\frac{6 k}{k^{2} - 3}\\right)$"
      ],
      "text/plain": [
       "Point2D(-(2*k - 3*k*sqrt(k**2 + 1)/(k**2 - 3) + 6*k/(k**2 - 3))/k, 3*k*sqrt(k**2 + 1)/(k**2 - 3) - 6*k/(k**2 - 3))"
      ]
     },
     "execution_count": 774,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "P"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 775,
   "id": "2fce6488",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\operatorname{Point2D}\\left(- \\frac{2 k + \\frac{3 k \\sqrt{k^{2} + 1}}{k^{2} - 3} + \\frac{6 k}{k^{2} - 3}}{k}, - \\frac{3 k \\sqrt{k^{2} + 1}}{k^{2} - 3} - \\frac{6 k}{k^{2} - 3}\\right)$"
      ],
      "text/plain": [
       "Point2D(-(2*k + 3*k*sqrt(k**2 + 1)/(k**2 - 3) + 6*k/(k**2 - 3))/k, -3*k*sqrt(k**2 + 1)/(k**2 - 3) - 6*k/(k**2 - 3))"
      ]
     },
     "execution_count": 775,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "Q"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 778,
   "id": "1f1bce78",
   "metadata": {},
   "outputs": [],
   "source": [
    "r=simplify(P.distance(Q))/2"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 779,
   "id": "d2da29be",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle 3 \\sqrt{\\frac{k^{2} \\left(k^{2} + 1\\right) + k^{2} + 1}{\\left(k^{2} - 3\\right)^{2}}}$"
      ],
      "text/plain": [
       "3*sqrt((k**2*(k**2 + 1) + k**2 + 1)/(k**2 - 3)**2)"
      ]
     },
     "execution_count": 779,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "r"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 780,
   "id": "faf9391a",
   "metadata": {},
   "outputs": [],
   "source": [
    "M=(P+Q)/2"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 781,
   "id": "8581d095",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\operatorname{Point2D}\\left(- \\frac{2 k^{2}}{k^{2} - 3}, - \\frac{6 k}{k^{2} - 3}\\right)$"
      ],
      "text/plain": [
       "Point2D(-2*k**2/(k**2 - 3), -6*k/(k**2 - 3))"
      ]
     },
     "execution_count": 781,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "M"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 782,
   "id": "aaa2c2a8",
   "metadata": {},
   "outputs": [],
   "source": [
    "c=Circle(M,r)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 784,
   "id": "be1070a3",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\frac{k^{2} x^{2} + 4 k^{2} x + k^{2} y^{2} - 5 k^{2} + 12 k y - 3 x^{2} - 3 y^{2} + 3}{k^{2} - 3}$"
      ],
      "text/plain": [
       "(k**2*x**2 + 4*k**2*x + k**2*y**2 - 5*k**2 + 12*k*y - 3*x**2 - 3*y**2 + 3)/(k**2 - 3)"
      ]
     },
     "execution_count": 784,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "\n",
    "simplify(expand(c.equation()))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 785,
   "id": "a92e64d2",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\operatorname{Line2D}\\left(\\operatorname{Point2D}\\left(0, \\frac{2}{m}\\right), \\operatorname{Point2D}\\left(1, \\frac{3}{m}\\right)\\right)$"
      ],
      "text/plain": [
       "Line2D(Point2D(0, 2/m), Point2D(1, 3/m))"
      ]
     },
     "execution_count": 785,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "l=Line(x-m*y+2)\n",
    "l"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 786,
   "id": "92811466",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle x^{2} - \\frac{y^{2}}{3} - 1$"
      ],
      "text/plain": [
       "x**2 - y**2/3 - 1"
      ]
     },
     "execution_count": 786,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "h.equation()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 790,
   "id": "1ba78efe",
   "metadata": {},
   "outputs": [],
   "source": [
    "expr=line_and_quadratic(l,h,first=False)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 791,
   "id": "bea4c812",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle - 12 m y + y^{2} \\cdot \\left(3 m^{2} - 1\\right) + 9$"
      ],
      "text/plain": [
       "-12*m*y + y**2*(3*m**2 - 1) + 9"
      ]
     },
     "execution_count": 791,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "expr"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 792,
   "id": "30a4cba5",
   "metadata": {},
   "outputs": [],
   "source": [
    "q=quadratic_function(expr,x=y)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 793,
   "id": "d83a0f02",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle 36 m^{2} + 36$"
      ],
      "text/plain": [
       "36*m**2 + 36"
      ]
     },
     "execution_count": 793,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "q.delta"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 794,
   "id": "e1c3df19",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\mathbb{R} \\cap \\left\\{\\frac{6 m}{3 m^{2} - 1} - \\frac{3 \\sqrt{m^{2} + 1}}{3 m^{2} - 1}, \\frac{6 m}{3 m^{2} - 1} + \\frac{3 \\sqrt{m^{2} + 1}}{3 m^{2} - 1}\\right\\}$"
      ],
      "text/plain": [
       "Intersection({6*m/(3*m**2 - 1) - 3*sqrt(m**2 + 1)/(3*m**2 - 1), 6*m/(3*m**2 - 1) + 3*sqrt(m**2 + 1)/(3*m**2 - 1)}, Reals)"
      ]
     },
     "execution_count": 794,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "q.roots"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 795,
   "id": "9077d9ea",
   "metadata": {},
   "outputs": [],
   "source": [
    "y1,y2=q.roots.args[1]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 797,
   "id": "ba1268cd",
   "metadata": {},
   "outputs": [],
   "source": [
    "expr1=simplify(expand((m*y1-2)*(m*y2-2)))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 800,
   "id": "e1cca445",
   "metadata": {},
   "outputs": [],
   "source": [
    "expr2=expr1-4*t/(3*m**2-1)+t**2+9/(3*m**2-1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 801,
   "id": "5c2ddf74",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle t^{2} - \\frac{4 t}{3 m^{2} - 1} + \\frac{- 3 m^{2} - 4}{3 m^{2} - 1} + \\frac{9}{3 m^{2} - 1}$"
      ],
      "text/plain": [
       "t**2 - 4*t/(3*m**2 - 1) + (-3*m**2 - 4)/(3*m**2 - 1) + 9/(3*m**2 - 1)"
      ]
     },
     "execution_count": 801,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "expr2"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 804,
   "id": "2e9eabf0",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\frac{\\left(t - 1\\right) \\left(3 m^{2} t + 3 m^{2} - t - 5\\right)}{3 m^{2} - 1}$"
      ],
      "text/plain": [
       "(t - 1)*(3*m**2*t + 3*m**2 - t - 5)/(3*m**2 - 1)"
      ]
     },
     "execution_count": 804,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "factor(expr2)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 805,
   "id": "7b689c4a",
   "metadata": {},
   "outputs": [],
   "source": [
    "expr=_"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 806,
   "id": "f92657f6",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "sympy.core.mul.Mul"
      ]
     },
     "execution_count": 806,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "type(expr)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 810,
   "id": "fc7414a3",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle 3 m^{2} t^{2} - 3 m^{2} - t^{2} - 4 t + 5$"
      ],
      "text/plain": [
       "3*m**2*t**2 - 3*m**2 - t**2 - 4*t + 5"
      ]
     },
     "execution_count": 810,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "expand(fraction(expr)[0])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 811,
   "id": "6578f3f5",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle - 3 m^{2} + t^{2} \\cdot \\left(3 m^{2} - 1\\right) - 4 t + 5$"
      ],
      "text/plain": [
       "-3*m**2 + t**2*(3*m**2 - 1) - 4*t + 5"
      ]
     },
     "execution_count": 811,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "collect(_,t)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 814,
   "id": "3b423198",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\operatorname{Line2D}\\left(\\operatorname{Point2D}\\left(0, m\\right), \\operatorname{Point2D}\\left(1, k + m\\right)\\right)$"
      ],
      "text/plain": [
       "Line2D(Point2D(0, m), Point2D(1, k + m))"
      ]
     },
     "execution_count": 814,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "l=Line(y-k*x-m)\n",
    "l"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 815,
   "id": "73cc07df",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/svg+xml": [
       "<svg xmlns=\"http://www.w3.org/2000/svg\"\n",
       "            xmlns:xlink=\"http://www.w3.org/1999/xlink\"\n",
       "            width=\"100.0\" height=\"100.0\" viewBox=\"-4.15692193816531 -2.42487113059643 8.31384387633061 4.84974226119286\"\n",
       "            preserveAspectRatio=\"xMinYMin meet\">\n",
       "            <defs>\n",
       "                <marker id=\"markerCircle\" markerWidth=\"8\" markerHeight=\"8\"\n",
       "                    refx=\"5\" refy=\"5\" markerUnits=\"strokeWidth\">\n",
       "                    <circle cx=\"5\" cy=\"5\" r=\"1.5\" style=\"stroke: none; fill:#000000;\"/>\n",
       "                </marker>\n",
       "                <marker id=\"markerArrow\" markerWidth=\"13\" markerHeight=\"13\" refx=\"2\" refy=\"4\"\n",
       "                       orient=\"auto\" markerUnits=\"strokeWidth\">\n",
       "                    <path d=\"M2,2 L2,6 L6,4\" style=\"fill: #000000;\" />\n",
       "                </marker>\n",
       "                <marker id=\"markerReverseArrow\" markerWidth=\"13\" markerHeight=\"13\" refx=\"6\" refy=\"4\"\n",
       "                       orient=\"auto\" markerUnits=\"strokeWidth\">\n",
       "                    <path d=\"M6,2 L6,6 L2,4\" style=\"fill: #000000;\" />\n",
       "                </marker>\n",
       "            </defs><g transform=\"matrix(1,0,0,-1,0,0)\"><ellipse fill=\"#66cc99\" stroke=\"#555555\" stroke-width=\"0.166276877526612\" opacity=\"0.6\" cx=\"0\" cy=\"0\" rx=\"3.46410161513775\" ry=\"1.73205080756888\"/></g></svg>"
      ],
      "text/latex": [
       "$\\displaystyle \\operatorname{Ellipse}\\left(\\operatorname{Point2D}\\left(0, 0\\right), 2 \\sqrt{3}, \\sqrt{3}\\right)$"
      ],
      "text/plain": [
       "Ellipse(Point2D(0, 0), 2*sqrt(3), sqrt(3))"
      ]
     },
     "execution_count": 815,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "e=Ellipse(O,2*sqrt(3),sqrt(3))\n",
    "e"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 816,
   "id": "395f03bc",
   "metadata": {},
   "outputs": [],
   "source": [
    "expr=line_and_quadratic(l,e)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 817,
   "id": "0e73f798",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle 8 k m x + 4 m^{2} + x^{2} \\cdot \\left(4 k^{2} + 1\\right) - 12$"
      ],
      "text/plain": [
       "8*k*m*x + 4*m**2 + x**2*(4*k**2 + 1) - 12"
      ]
     },
     "execution_count": 817,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "expr"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 818,
   "id": "1ea1bee7",
   "metadata": {},
   "outputs": [],
   "source": [
    "q=quadratic_function(expr)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 820,
   "id": "dfba765c",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle 16 \\cdot \\left(12 k^{2} - m^{2} + 3\\right)$"
      ],
      "text/plain": [
       "16*(12*k**2 - m**2 + 3)"
      ]
     },
     "execution_count": 820,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "factor(q.delta)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 821,
   "id": "0ef0b7e1",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\operatorname{Line2D}\\left(\\operatorname{Point2D}\\left(0, - \\frac{2}{m}\\right), \\operatorname{Point2D}\\left(1, - \\frac{1}{m}\\right)\\right)$"
      ],
      "text/plain": [
       "Line2D(Point2D(0, -2/m), Point2D(1, -1/m))"
      ]
     },
     "execution_count": 821,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "l=Line(x-m*y-2)\n",
    "l"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 822,
   "id": "beac858d",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle x^{2} - \\frac{y^{2}}{3} - 1$"
      ],
      "text/plain": [
       "x**2 - y**2/3 - 1"
      ]
     },
     "execution_count": 822,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "h=Hyperbola(O,1,sqrt(3))\n",
    "h.equation()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 823,
   "id": "72384e9f",
   "metadata": {},
   "outputs": [],
   "source": [
    "expr=line_and_quadratic(l,h,first=False)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 824,
   "id": "4572743e",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle 12 m y + y^{2} \\cdot \\left(3 m^{2} - 1\\right) + 9$"
      ],
      "text/plain": [
       "12*m*y + y**2*(3*m**2 - 1) + 9"
      ]
     },
     "execution_count": 824,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "expr"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 826,
   "id": "3799f8b5",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\operatorname{Line2D}\\left(\\operatorname{Point2D}\\left(0, \\frac{3}{t}\\right), \\operatorname{Point2D}\\left(1, \\frac{4}{t}\\right)\\right)$"
      ],
      "text/plain": [
       "Line2D(Point2D(0, 3/t), Point2D(1, 4/t))"
      ]
     },
     "execution_count": 826,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "l=Line(x-t*y+3)\n",
    "l"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 827,
   "id": "8a254f93",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle y - \\frac{x}{t} - \\frac{3}{t}$"
      ],
      "text/plain": [
       "y - x/t - 3/t"
      ]
     },
     "execution_count": 827,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "l.equation()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 828,
   "id": "70fa104d",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\frac{x^{2}}{4} + \\frac{y^{2}}{3} - 1$"
      ],
      "text/plain": [
       "x**2/4 + y**2/3 - 1"
      ]
     },
     "execution_count": 828,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "e=Ellipse(O,2,sqrt(3))\n",
    "e.equation()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 829,
   "id": "19eda2bf",
   "metadata": {},
   "outputs": [],
   "source": [
    "expr=line_and_quadratic(l,e,first=False)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 830,
   "id": "18d0edf5",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle - 18 t y + y^{2} \\cdot \\left(3 t^{2} + 4\\right) + 15$"
      ],
      "text/plain": [
       "-18*t*y + y**2*(3*t**2 + 4) + 15"
      ]
     },
     "execution_count": 830,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "expr"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 832,
   "id": "60b67b01",
   "metadata": {},
   "outputs": [],
   "source": [
    "q=quadratic_function(expr,x=y)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 834,
   "id": "f65fc9fa",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\left(\\frac{5}{3}, \\infty\\right)$"
      ],
      "text/plain": [
       "Interval.open(5/3, oo)"
      ]
     },
     "execution_count": 834,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "solveset(q.delta>0,t**2,Reals)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 835,
   "id": "9954e4ac",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\sqrt{\\frac{1}{2} - \\frac{\\sqrt{2}}{4}}$"
      ],
      "text/plain": [
       "sqrt(1/2 - sqrt(2)/4)"
      ]
     },
     "execution_count": 835,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "sin(pi/8)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 836,
   "id": "37aed481",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "625"
      ]
     },
     "execution_count": 836,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "24**2+7**2"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 838,
   "id": "1812d79f",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\tan{\\left(x \\right)}$"
      ],
      "text/plain": [
       "tan(x)"
      ]
     },
     "execution_count": 838,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "simplify(expand_trig(sin(2*x)/(1+cos(2*x))))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 844,
   "id": "59c620f7",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\left(\\sin{\\left(x \\right)} - \\sin{\\left(y \\right)}\\right) \\left(\\sin{\\left(x \\right)} + \\sin{\\left(y \\right)}\\right)$"
      ],
      "text/plain": [
       "(sin(x) - sin(y))*(sin(x) + sin(y))"
      ]
     },
     "execution_count": 844,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "(factor(sin(x)**2-sin(y)**2))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 848,
   "id": "76a4e49f",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle 0$"
      ],
      "text/plain": [
       "0"
      ]
     },
     "execution_count": 848,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "trigsimp((sin(x)-sin(y))-2*cos((x+y)/2)*sin((x-y)/2))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 851,
   "id": "3ebea8e2",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\left\\{-3, \\frac{1}{3}\\right\\}$"
      ],
      "text/plain": [
       "{-3, 1/3}"
      ]
     },
     "execution_count": 851,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "solveset(expand_trig(tan(2*x))-Rational(3,4),tan(x),Reals)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 852,
   "id": "cb73551b",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle - \\cos{\\left(x \\right)} \\cos{\\left(x + \\frac{\\pi}{3} \\right)}$"
      ],
      "text/plain": [
       "-cos(x)*cos(x + pi/3)"
      ]
     },
     "execution_count": 852,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "expr=sin(x-pi/6)*cos(x)\n",
    "expr"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 853,
   "id": "196f130a",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle - \\left(- \\frac{\\sqrt{3} \\sin{\\left(x \\right)}}{2} + \\frac{\\cos{\\left(x \\right)}}{2}\\right) \\cos{\\left(x \\right)}$"
      ],
      "text/plain": [
       "-(-sqrt(3)*sin(x)/2 + cos(x)/2)*cos(x)"
      ]
     },
     "execution_count": 853,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "\n",
    "expand_trig(expr)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 854,
   "id": "53dcf50e",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle - \\frac{\\cos{\\left(2 x + \\frac{\\pi}{3} \\right)}}{2} - \\frac{1}{4}$"
      ],
      "text/plain": [
       "-cos(2*x + pi/3)/2 - 1/4"
      ]
     },
     "execution_count": 854,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "trigsimp(_)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 855,
   "id": "e282ddde",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\left[0, \\frac{\\pi}{2}\\right]$"
      ],
      "text/plain": [
       "Interval(0, pi/2)"
      ]
     },
     "execution_count": 855,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "Interval(0,pi/2)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 856,
   "id": "68094dd6",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\cos{\\left(\\frac{x}{3} + \\frac{\\pi}{3} \\right)}$"
      ],
      "text/plain": [
       "cos(x/3 + pi/3)"
      ]
     },
     "execution_count": 856,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "sin(pi/6-Rational(1,3)*x)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 860,
   "id": "c72bed7f",
   "metadata": {},
   "outputs": [],
   "source": [
    "q=quadratic_function(S(18),-48,46)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 861,
   "id": "672e14bf",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle 18 \\left(x - \\frac{4}{3}\\right)^{2} + 14$"
      ],
      "text/plain": [
       "18*(x - 4/3)**2 + 14"
      ]
     },
     "execution_count": 861,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "q.symmetry_equation()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 863,
   "id": "b8b94a49",
   "metadata": {},
   "outputs": [],
   "source": [
    "from sympy import N"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 864,
   "id": "e68647cd",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle -1.88225099390856$"
      ],
      "text/plain": [
       "-1.88225099390856"
      ]
     },
     "execution_count": 864,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "N(11-8*sqrt(2))*6"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 865,
   "id": "4122fc64",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\text{True}$"
      ],
      "text/plain": [
       "True"
      ]
     },
     "execution_count": 865,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "\n",
    "cos(-23*pi/5)<cos(-17*pi/4)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 866,
   "id": "2af2c03d",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\text{True}$"
      ],
      "text/plain": [
       "True"
      ]
     },
     "execution_count": 866,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "sin(pi/180*194)>cos(160/180*pi)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 867,
   "id": "1abe1ff1",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle 4 \\cos^{3}{\\left(x \\right)} - 3 \\cos{\\left(x \\right)}$"
      ],
      "text/plain": [
       "4*cos(x)**3 - 3*cos(x)"
      ]
     },
     "execution_count": 867,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "expand_trig(cos(3*x))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 868,
   "id": "32b17e23",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle - 4 \\sin^{3}{\\left(x \\right)} + 3 \\sin{\\left(x \\right)}$"
      ],
      "text/plain": [
       "-4*sin(x)**3 + 3*sin(x)"
      ]
     },
     "execution_count": 868,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "expand_trig(sin(3*x))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 871,
   "id": "c66ebc51",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\left[\\frac{15}{7}, 3\\right)$"
      ],
      "text/plain": [
       "Interval.Ropen(15/7, 3)"
      ]
     },
     "execution_count": 871,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "Interval.Ropen(Rational(15,7),3)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 873,
   "id": "cee8495e",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle 6.22826251895963$"
      ],
      "text/plain": [
       "6.22826251895963"
      ]
     },
     "execution_count": 873,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "N(log(6,10)/log(Rational(4,3),10))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 874,
   "id": "36f2006d",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle x^{2} + y^{2} = y \\left|{x}\\right| + 1$"
      ],
      "text/plain": [
       "Eq(x**2 + y**2, y*Abs(x) + 1)"
      ]
     },
     "execution_count": 874,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "eq=Eq(x**2+y**2,1+abs(x)*y)\n",
    "eq"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 876,
   "id": "5e57b86e",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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PYMHJ5/5zMr3vfOdydix3T8fULaWRqPRqHsIoHnNmZPcf3/S2Zlceml134IFq464DTZYdcC96pe/TH7849c+32qrZODA6uNPfjLZdNPq48MOSzbaqFvGT5J0dHSktbU17e3tGTp0aLc85wsvJNdcU328eHEyfXr18SuvJL/97WuPGz8+ee97V/88V1+dvPjiG+8fPDjZYovq4//5P5MBA5Jdd0122KE7pgdKJeyAlbzwQvKv/1pFy/e+lyxblixfXm1ZGzQoGT48Oeig6rGTJiVDhqz8/euvv/rnXrasur3+vosuqj7+r/9KLr44edvbkkYjGTYs2W23ZN99k223TTbbLOnff+1f01sJu2XLkueeS3796+T225P77kvmz09aWqp5jzuumjdJpkx543z9+6955qVLV/58yZLkW9+qPv6nf0rmzUtefrnaEtivX/Vcn/hEcvjhyc47JxtuuFYvByicsAOSJA8+WMXc7bcnTz1V3feudyV7753ssUcVEcOHr7t5li5Nbr65+vi225K5c5Mtt6wC8zOfqbbovec9XXuutQ27xx5Lfv/7avdye3vy9NPJu9+d7Ldf9fUDDlhzwHa3efOq2L777uTOO5Mnn6zu32abKnoPPzzZaad1Nw/QvIQd9HHXXptceGHyb//22n2f+ERyxBHJuHHJO95R32yv98gj1XFqV1xR7QpetKjaonfggckuu6z++7oSdg88kPzzP1db5N7xjmpX6DHHVAE5ZkwPvaA3YdGiall997vVFtVXjRuXHH98tRsb6LuEHfRBjUYyc2Zy1FHJs88mf/xj8rd/W235Oeyw5C/+ou4J/7yXX652G997b/Loo8mPfpRsvXVy6KHJhAmv7R5NVh12//VfyQ9+kFx3XbVFbM89k+23r97QsdFGrx3718wWLqzC/Jprkp/+NFlvvWTzzZNvfzv5H/+j2l0M9C3CDvqYjo7knHOSr3yl+nyHHZKjj04++9neHwL33Zf87GfJXXdVb1j41Keq3ZVLl1Zh9+yz7Xn++aG5+urqjRx77VW9/l13rXvyt6bRSC65JPnmN6s3uyTJ5z6XnHlm0k3vFQF6CWEHfcjjj1fvPn3ooerztrbk3HO79x2ozeLRR5Pvf7/aIrnpph35whda89nPtmf48KH5yEeqrXOl+f3vkzPOSL7+9erz97+/erfuX/5lvXMB646wgz7i2murY7B+97vqDQgXXlhFXr/CT1P+8svJnDkd2WWX1jzzTHs237zsTVjLl1cxd/zx1Rs/NtmkWtaOvYO+QdhBH3DkkdX50pYvrw6yv+qqrr+jtAQ9cR67ZvfYY8mnP1290aJfv2q39JVX1j0V0NMK/7c69G1Ll1bnhbvmmur8Z8cdV73ZoC9FXV/1nvdUy/q446plf8011brw+vPmAWWxxQ4Kdsstyf77Vx8feGB1wtu+qC9usftTBx1UncolSWbMSD72sVrHAXqQLXZQqCeeSE47rfp4woTXLnlF3zN9erUOJNU68cQT9c4D9BxhB4U688zkV7+qTncxfXp1OTD6pkGDqnVg6NBqnTjzzLonAnqKsIMC3XBDctNN1WWvLr442XjjuieibhtvXK0L669frRs33FD3REBPcIwdFGbRouRv/qa6KsHHP57ceGPdE9Wvrx9j96cOPrgKu7/4i+pkzs10yTjgrbPFDgpz661V1G27bXLeeXVPQ7M577xq3Vi4sFpXgLIIOyjMLbdU/x0/3hUHeKO//Mtq3UheW1eAcgg7KMhPfpI8+GD18Tnn1DsLzevVdePBB6t1BiiHsIOCLFpU3d73Pu+CZfUGDarWkVfXF6Acwg4KMmVK9d+PfrQ6tQWsytCh1TqSVNeUBcoh7KAgS5cmra3JAQfUPQnN7oADqnXFJcagLMIOCjN4cDJ6dN1T0OxGj67WFaAswg4K8W//lixZUvcU9DZLllTrDlAGYQeFmDkz6ehINtmk7knoLTbZJGlvr9YdoAzCDgrjpMR0lXUFyiPsAAAKIewAAAoh7AAACiHsoBCHHeaNE6y9TTet1h2gDMIOCvGudyUDByazZtU9Cb3FrFnVOvOud9U9CdBdhB0U5rrr6p6A3sK6AuURdgAAhRB2UJBTTql7Anqb//W/6p4A6E7CDgoycmTy4ovJ/ffXPQnN7v77q3Vl5Mi6JwG6k7CDgmy3XbL11sldd9U9Cc3urruqdWW77eqeBOhOwg4Kss02yYgRyZNPJp2ddU9Ds+rsrNaRESOqdQYoh7CDwuyyS3L11ckLL9Q9Cc3qhReqdWSXXeqeBOhuwg4K86lPVf/9wx/qnYPm9eq68eq6ApRD2EFhNtww+ehHk3/4h7onoVn9wz9U68iGG9Y9CdDdhB0UZvDg5JBDkuefT557ru5paDbPPVetG4ccUq0rQFmEHRTosMOSxx5LHnmk7kloNo88Uq0brg8LZRJ2UKhLL00mT657CprN5MnVugGUSdhBocaNS7bYIrn55ronoVncfHO1TowbV/ckQE8RdlCoLbdM9twzueEG57SjWgduuKFaJ7bcsu5pgJ7S0mg0GnUPAfSM3/wmede7kgULks03r3ua+nR0dKS1tTXt7e0ZOnRo3ePU4tlnq611Tz5ZXXECKJMtdlCwrbdOvvzl5IQT6p6Eup1wQrUuiDoom7CDwn3uc8nPf57MmVP3JNRlzpxqHfjc5+qeBOhpwg76gM98Jjn++LqnoC7HH1+tA0D5hB30AW1t1S64++6re5I375JLLsmIESMycODAjBkzJvfee2/dI/UK991XLfu2tronAdYFYQd9wNvelpx3XnV75ZW1+9758+f3zFBr4YYbbsiJJ56YL3zhC/npT3+aD3zgA5kwYULmzZtX92hN7ZVXXlvub3tb3dMA64Kwgz5i+PDqMlIXXLB23zdq1KicccYZeemll3pmsC746le/mkmTJuXoo4/Oe9/73nzta1/LsGHDcqkz7a7RBRdUy3z48LonAdaV9bryoEajkSVLlvT0LEAPO/DA5Kijkv/3/5KxY7v2PTNmzMjpp5+eK664ImeeeWY++clP9uyQr7N06dLMnj07xx9/fDo6Olbcv/vuu+eee+5Z6b5XdXZ2pvNPTt736t9fq3psqWbPTn72s+rdsH3oZUPRhgwZkpaWljU+pkvnsXv1HFAAANSjK+fi7FLY9cUtdh0dHRk2bFjmz5/fZ09o2hf01eV8ww3Jww8n55+f9FuLAzJefvnlfPWrX81FF12UD33oQzn33HMzcuTInhs0ycKFCzNq1KjMnDkzO+6444r7L7jgglx//fV5+OGH3/A9r99it3Dhwuy44475j//4j2xZ+GUXli9PTjstGTOm2g3bl/TVP899TV9ezl3ZYtelXbEtLS197pf3qqFDh/bZ196X9LXl/MlPJj/6UbWrbvfdu/596623Xvbbb78sXbo0F154Ye666660tbXl7LPPzpAhQ3pk1oEDB6Z///5ZsmTJSsuoo6MjW2yxxVottyFDhhS/nGfNSl54oVrGgwbVPU09+tqf577Kcl41b56APmjQoOSb30zOPDP57W/X/NhvfOMbmTRpUkaPHp3W1tbstddeuf/++9PW1pZLLrkkc+bMyV/91V9l9uzZPTLr+uuvnzFjxmTmzJkr3T9z5szssssuPfIze6vf/rZapt/8Zt+NOujrurTFDijPBhtUB9b/n/+TfPGLycYbr/px5513Xnbaaad8+tOfzk477ZSxY8dmwIABK75+1FFH5Utf+lImTpyYRx99tEdmPemkk3LEEUdk7Nix2XnnnXP55Zdn3rx5mTx5co/8vN7o+eerZXnCCdWyBfomYbcaAwYMyFlnnbXS/8AoT19fzgceWJ3r7IwzkosvTlZ16EZXzmM3adKknHHGGT0wYeWQQw7J7373u5xzzjlZuHBhtt9++9xxxx3ZuosXPn11+Za6nBuNahnuumu1TPuqvv7nua+wnNesS2+eAMr1yivJkUcmxx6b7LHHm3uORqORe+65J7uvzQF769Cr7+zvyjvKeqO7704uuyy58spk4MC6pwHqZIsd9HEDByZXX50cdli1xe7NtFlLS0vTRl3pZs1Kvv715NprXV0C8OYJIFUQTJ2aXHhh8uMf1z0NXfXjH1fLbOpUUQdUbLEDkiTvfnd18P1nP5u0tibve1/dE7EmjzxSBd0ll1TLDiBxjB3wOosWVQfg33RTsvnmdU/TPUo7xu7ZZ5OPfzz5539O3vGOuqcBmoldscBK3vGO6pitSZOSPnbBmV5hyZJq2Xz966IOeCNhtxY6Ozuzww47pKWlJXPmzKl7HLrRU089lUmTJmXEiBEZNGhQRo4cmbPOOitLly6te7RajB6d/P3fJ0ccUfckb90ll1ySv/7rv06SfPCDH8y9995b80RvzRFHVMtm9Oi6J2keU6dOzfvf//4MGTIkm222Wfbff/889thjdY9FD5o6dWpaWlpy4okn1j1K0xF2a+GUU07JFltsUfcY9IBf/epXWb58eS677LL84he/yD/+4z/mG9/4Rj7/+c/XPVptDj88mTAhmTgxaW+ve5o354YbbsiJJ56Yk08+OUmy8847Z8KECZk3b17Nk6299vZqWUyYUC0bXjNr1qy0tbXlwQcfzMyZM/PHP/4xe++9d1566aW6R6MHPPTQQ7n88ssz2r9uVq1Bl9xxxx2NUaNGNX7xi180kjR++tOf1j0SPezLX/5yY8SIEXWPUavlyxuNH/2o0Tj00Eajs7Puadbejjvu2Jg8eXKjvb29kaTR3t7eGDVqVOO0006re7S10tlZLYMf/ahaJqzZc88910jSmDVrVt2j0M2WLFnS2HbbbRszZ85s7L777o0TTjih7pGaji12XfDss8/mmGOOyXe/+90MHjy47nFYR9rb27Px6q6z1Ue0tCQf+lCy007VReUXLqx7oq5bunRpHn744ey9994r3b/33nvngQceqGmqtbdwYfW732mnalms6uogrKz9vzcx9/U/vyVqa2vLRz7ykey11151j9K0nO7kz2g0Gpk4cWImT56csWPH5qmnnqp7JNaBJ554IhdddFG+8pWv1D1KUzjhhOQDH6h2BV55ZdIbjkhYvHhxli1bls1f99bezTffPM8880xNU62dBQuqq4JMner0M13VaDRy0kknZbfddsv2229f9zh0o+uvvz6PPPJIHnroobpHaWp9dovd2WefnZaWljXeZs+enYsuuigdHR05/fTT6x6ZN6Gry/lPLViwIPvss08OPvjgHH300TVN3nze977k5JOTY45J5s6te5qua3ndJq5Go/GG+5rR3LnV7/rkk0Xd2jjuuOPy85//PNddd13do9CN5s+fnxNOOCHTp0/PQNfNW6M+ex67xYsXZ/HixWt8zDbbbJNDDz00t91220r/I1i2bFn69++fww8/PFdddVVPj8pb0NXl/OpfFAsWLMj48eMzbty4fOc730m/fn323z6r9cQTyXHHVVvx9tmn7mlWb+nSpRk8eHBuvPHG7LnnnivOY3fGGWdkzpw5mTVrVt0jrtYPf5j83/+bXHxxMnJk3dP0HlOmTMmMGTNyzz33ZMSIEXWPQzeaMWNGDjjggPTv33/FfcuWLUtLS0v69euXzs7Olb7Wl/XZsOuqefPmpaOjY8XnCxYsyIc//OHcdNNNGTduXLbaaqsap6M7Pf300xk/fnzGjBmT6dOn+0tiDX7/++TQQ5Nzz0123LHuaVZv3LhxGTNmTM4///wVYbfTTjvlYx/7WKZOnVr3eKv0k58kZ5yRXH99stFGdU/TOzQajUyZMiU333xz7r777my77bZ1j0Q3W7JkSX7zm9+sdN+RRx6ZUaNG5dRTT7Xb/U84xu7PGD58+Eqfb7DBBkmSkSNHirqCLFiwIHvssUeGDx+eadOmZdGiRSu+9s53vrPGyZrTRhsl3/52csopyZgxyUkn1T3Rqp100kk54ogjst122yVJTjvttMybNy+TJ0+uebJV++pXk4cfrn63oq7r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\n",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/plain": [
       "<sympy.plotting.plot.Plot at 0x7f264fde0400>"
      ]
     },
     "execution_count": 876,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "plot_implicit(eq)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 881,
   "id": "3edf6e2d",
   "metadata": {},
   "outputs": [],
   "source": [
    "a,b=symbols(\"a,b\",positive=True)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 883,
   "id": "6dce9332",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle -1 + \\frac{x^{2}}{b^{2}} + \\frac{y^{2}}{a^{2}}$"
      ],
      "text/plain": [
       "-1 + x**2/b**2 + y**2/a**2"
      ]
     },
     "execution_count": 883,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "e=Ellipse(O,b,a)\n",
    "e.equation()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 886,
   "id": "8a2d1464",
   "metadata": {},
   "outputs": [],
   "source": [
    "P=e.arbitrary_point()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 887,
   "id": "15f3699f",
   "metadata": {},
   "outputs": [],
   "source": [
    "expr=(P.y-a)/P.x*(P.y+a)/P.x"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 888,
   "id": "9ed384c9",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle - \\frac{a^{2}}{b^{2}}$"
      ],
      "text/plain": [
       "-a**2/b**2"
      ]
     },
     "execution_count": 888,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "simplify(expr)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 940,
   "id": "6b3340a8",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle -1 - \\frac{x^{2}}{b^{2}} + \\frac{y^{2}}{a^{2}}$"
      ],
      "text/plain": [
       "-1 - x**2/b**2 + y**2/a**2"
      ]
     },
     "execution_count": 940,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "h=Hyperbola(O,a,b,slope=oo)\n",
    "h.equation()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 932,
   "id": "37b39930",
   "metadata": {},
   "outputs": [],
   "source": [
    "Q=h.arbitrary_point()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 933,
   "id": "8dc7ee0f",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\operatorname{Point2D}\\left(b \\tan{\\left(t \\right)}, \\frac{a}{\\cos{\\left(t \\right)}}\\right)$"
      ],
      "text/plain": [
       "Point2D(b*tan(t), a/cos(t))"
      ]
     },
     "execution_count": 933,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "Q"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 934,
   "id": "5fe2d07f",
   "metadata": {},
   "outputs": [],
   "source": [
    "expr=(Q.y-a)/Q.x*(Q.y+a)/Q.x"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 935,
   "id": "3de97327",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\frac{a^{2}}{b^{2}}$"
      ],
      "text/plain": [
       "a**2/b**2"
      ]
     },
     "execution_count": 935,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "simplify(expr)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 936,
   "id": "4860dc34",
   "metadata": {},
   "outputs": [],
   "source": [
    "h=Hyperbola(O,sqrt(2),sqrt(2),slope=-1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 937,
   "id": "185b15fe",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle - x y - 1$"
      ],
      "text/plain": [
       "-x*y - 1"
      ]
     },
     "execution_count": 937,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "simplify(h.equation())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 938,
   "id": "514b0bf2",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\operatorname{Point2D}\\left(\\tan{\\left(t \\right)} + \\frac{1}{\\cos{\\left(t \\right)}}, \\tan{\\left(t \\right)} - \\frac{1}{\\cos{\\left(t \\right)}}\\right)$"
      ],
      "text/plain": [
       "Point2D(tan(t) + 1/cos(t), tan(t) - 1/cos(t))"
      ]
     },
     "execution_count": 938,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "h.arbitrary_point()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 941,
   "id": "12cbde26",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle -1 - \\frac{x^{2}}{b^{2}} + \\frac{y^{2}}{a^{2}}$"
      ],
      "text/plain": [
       "-1 - x**2/b**2 + y**2/a**2"
      ]
     },
     "execution_count": 941,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "h.equation()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 942,
   "id": "6a70f9c0",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle - k x + y$"
      ],
      "text/plain": [
       "-k*x + y"
      ]
     },
     "execution_count": 942,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "l=Line(y-k*x)\n",
    "l.equation()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 943,
   "id": "ff5e76c3",
   "metadata": {},
   "outputs": [],
   "source": [
    "A,B=Intersection(l,h)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 944,
   "id": "0be5dd6d",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\operatorname{Point2D}\\left(b \\tan{\\left(t \\right)}, \\frac{a}{\\cos{\\left(t \\right)}}\\right)$"
      ],
      "text/plain": [
       "Point2D(b*tan(t), a/cos(t))"
      ]
     },
     "execution_count": 944,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "Q"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 946,
   "id": "72611a09",
   "metadata": {},
   "outputs": [],
   "source": [
    "expr=Line(Q,A).slope*Line(Q,B).slope"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 947,
   "id": "e7634f92",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\frac{a^{2}}{b^{2}}$"
      ],
      "text/plain": [
       "a**2/b**2"
      ]
     },
     "execution_count": 947,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "simplify(expr)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 948,
   "id": "844ffeb2",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle -1 + \\frac{y^{2}}{b^{2}} + \\frac{x^{2}}{a^{2}}$"
      ],
      "text/plain": [
       "-1 + y**2/b**2 + x**2/a**2"
      ]
     },
     "execution_count": 948,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "e=Ellipse(O,a,b)\n",
    "e.equation()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 949,
   "id": "1e732cb1",
   "metadata": {},
   "outputs": [],
   "source": [
    "l=Line(y-k*x+m)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 951,
   "id": "07ffc54d",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle - k x + m + y$"
      ],
      "text/plain": [
       "-k*x + m + y"
      ]
     },
     "execution_count": 951,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "l.equation()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 952,
   "id": "a77a1c77",
   "metadata": {},
   "outputs": [],
   "source": [
    "A,B=Intersection(l,e)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 953,
   "id": "e87efaba",
   "metadata": {},
   "outputs": [],
   "source": [
    "P=e.arbitrary_point()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 954,
   "id": "e180a673",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\operatorname{Point2D}\\left(a \\cos{\\left(t \\right)}, b \\sin{\\left(t \\right)}\\right)$"
      ],
      "text/plain": [
       "Point2D(a*cos(t), b*sin(t))"
      ]
     },
     "execution_count": 954,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "\n",
    "P"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 955,
   "id": "aee9d7ae",
   "metadata": {},
   "outputs": [],
   "source": [
    "expr=Line(P,A).slope*Line(P,B).slope"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 957,
   "id": "087ef9a3",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\left(\\mathbb{R} \\cap \\left\\{- \\frac{\\sqrt{2} a b \\sqrt{- a^{2} \\cos{\\left(2 t \\right)} + a^{2} - 2 a b k \\sin{\\left(2 t \\right)} + b^{2} k^{2} \\cos{\\left(2 t \\right)} + b^{2} k^{2}}}{2 \\left(a^{2} + b^{2}\\right)} + \\frac{a^{3} k \\cos{\\left(t \\right)} - b^{3} \\sin{\\left(t \\right)}}{a^{2} + b^{2}}, \\frac{\\sqrt{2} a b \\sqrt{- a^{2} \\cos{\\left(2 t \\right)} + a^{2} - 2 a b k \\sin{\\left(2 t \\right)} + b^{2} k^{2} \\cos{\\left(2 t \\right)} + b^{2} k^{2}}}{2 \\left(a^{2} + b^{2}\\right)} + \\frac{a^{3} k \\cos{\\left(t \\right)} - b^{3} \\sin{\\left(t \\right)}}{a^{2} + b^{2}}\\right\\}\\right) \\setminus \\left(\\mathbb{R} \\cap \\left\\{a k \\cos{\\left(t \\right)} - b \\sqrt{- \\left(\\cos{\\left(t \\right)} - 1\\right) \\left(\\cos{\\left(t \\right)} + 1\\right)}, a k \\cos{\\left(t \\right)} + b \\sqrt{- \\left(\\cos{\\left(t \\right)} - 1\\right) \\left(\\cos{\\left(t \\right)} + 1\\right)}\\right\\}\\right)$"
      ],
      "text/plain": [
       "Complement(Intersection({-sqrt(2)*a*b*sqrt(-a**2*cos(2*t) + a**2 - 2*a*b*k*sin(2*t) + b**2*k**2*cos(2*t) + b**2*k**2)/(2*(a**2 + b**2)) + (a**3*k*cos(t) - b**3*sin(t))/(a**2 + b**2), sqrt(2)*a*b*sqrt(-a**2*cos(2*t) + a**2 - 2*a*b*k*sin(2*t) + b**2*k**2*cos(2*t) + b**2*k**2)/(2*(a**2 + b**2)) + (a**3*k*cos(t) - b**3*sin(t))/(a**2 + b**2)}, Reals), Intersection({a*k*cos(t) - b*sqrt(-(cos(t) - 1)*(cos(t) + 1)), a*k*cos(t) + b*sqrt(-(cos(t) - 1)*(cos(t) + 1))}, Reals))"
      ]
     },
     "execution_count": 957,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "solveset(simplify(expr)+1,m,Reals)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 958,
   "id": "e55bf56a",
   "metadata": {},
   "outputs": [],
   "source": [
    "answer=_"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 966,
   "id": "575d1c05",
   "metadata": {},
   "outputs": [],
   "source": [
    "check=answer.args[0].args[1]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 968,
   "id": "df0425f8",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "2"
      ]
     },
     "execution_count": 968,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "len(check.args)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 970,
   "id": "5c4363c5",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle - \\frac{\\sqrt{2} a b \\sqrt{- a^{2} \\cos{\\left(2 t \\right)} + a^{2} - 2 a b k \\sin{\\left(2 t \\right)} + b^{2} k^{2} \\cos{\\left(2 t \\right)} + b^{2} k^{2}}}{2 \\left(a^{2} + b^{2}\\right)} + \\frac{a^{3} k \\cos{\\left(t \\right)} - b^{3} \\sin{\\left(t \\right)}}{a^{2} + b^{2}}$"
      ],
      "text/plain": [
       "-sqrt(2)*a*b*sqrt(-a**2*cos(2*t) + a**2 - 2*a*b*k*sin(2*t) + b**2*k**2*cos(2*t) + b**2*k**2)/(2*(a**2 + b**2)) + (a**3*k*cos(t) - b**3*sin(t))/(a**2 + b**2)"
      ]
     },
     "execution_count": 970,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "check.args[0]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 973,
   "id": "54a38556",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\frac{\\sqrt{2} a b \\sqrt{- a^{2} \\cos{\\left(2 t \\right)} + a^{2} - 2 a b k \\sin{\\left(2 t \\right)} + b^{2} k^{2} \\cos{\\left(2 t \\right)} + b^{2} k^{2}}}{2 \\left(a^{2} + b^{2}\\right)} + \\frac{a^{3} k \\cos{\\left(t \\right)} - b^{3} \\sin{\\left(t \\right)}}{a^{2} + b^{2}}$"
      ],
      "text/plain": [
       "sqrt(2)*a*b*sqrt(-a**2*cos(2*t) + a**2 - 2*a*b*k*sin(2*t) + b**2*k**2*cos(2*t) + b**2*k**2)/(2*(a**2 + b**2)) + (a**3*k*cos(t) - b**3*sin(t))/(a**2 + b**2)"
      ]
     },
     "execution_count": 973,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "(check.args[1])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 974,
   "id": "7309b066",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\left[\\begin{matrix}x\\\\y\\\\1\\end{matrix}\\right]$"
      ],
      "text/plain": [
       "Matrix([\n",
       "[x],\n",
       "[y],\n",
       "[1]])"
      ]
     },
     "execution_count": 974,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "X=Matrix([x,y,1])\n",
    "X"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 975,
   "id": "b777ad57",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\left[\\begin{matrix}1 & 0 & 0\\\\0 & 1 & 0\\\\0 & 0 & -1\\end{matrix}\\right]$"
      ],
      "text/plain": [
       "Matrix([\n",
       "[1, 0,  0],\n",
       "[0, 1,  0],\n",
       "[0, 0, -1]])"
      ]
     },
     "execution_count": 975,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "A=Matrix([[1,0,0],[0,1,0],[0,0,-1]])\n",
    "A"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 976,
   "id": "ff0d9e17",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\left[\\begin{matrix}0 & 0 & \\frac{1}{2}\\\\0 & 0 & \\frac{1}{2}\\\\\\frac{1}{2} & \\frac{1}{2} & -1\\end{matrix}\\right]$"
      ],
      "text/plain": [
       "Matrix([\n",
       "[  0,   0, 1/2],\n",
       "[  0,   0, 1/2],\n",
       "[1/2, 1/2,  -1]])"
      ]
     },
     "execution_count": 976,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "B=Matrix([[0,0,Rational(1,2)],[0,0,Rational(1,2)],[Rational(1,2),Rational(1,2),-1]])\n",
    "B"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 977,
   "id": "b698c339",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\left[\\begin{matrix}x + y - 1\\end{matrix}\\right]$"
      ],
      "text/plain": [
       "Matrix([[x + y - 1]])"
      ]
     },
     "execution_count": 977,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "X.T*B*X"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 980,
   "id": "ba84bcb3",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\left[\\begin{matrix}x^{2} + y^{2} - 1\\end{matrix}\\right]$"
      ],
      "text/plain": [
       "Matrix([[x**2 + y**2 - 1]])"
      ]
     },
     "execution_count": 980,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "X.T*A*X"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 981,
   "id": "06e11ff9",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\left[\\begin{matrix}x^{2} - x + y^{2} - y\\end{matrix}\\right]$"
      ],
      "text/plain": [
       "Matrix([[x**2 - x + y**2 - y]])"
      ]
     },
     "execution_count": 981,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "X.T*A*X-X.T*B*X"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 982,
   "id": "ee39e957",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\left[\\begin{matrix}x \\left(x - \\frac{1}{2}\\right) - \\frac{x}{2} + y \\left(y - \\frac{1}{2}\\right) - \\frac{y}{2}\\end{matrix}\\right]$"
      ],
      "text/plain": [
       "Matrix([[x*(x - 1/2) - x/2 + y*(y - 1/2) - y/2]])"
      ]
     },
     "execution_count": 982,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "X.T*(A-B)*X"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 983,
   "id": "68192b48",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\left[\\begin{matrix}1 & 0 & - \\frac{1}{2}\\\\0 & 1 & - \\frac{1}{2}\\\\- \\frac{1}{2} & - \\frac{1}{2} & 0\\end{matrix}\\right]$"
      ],
      "text/plain": [
       "Matrix([\n",
       "[   1,    0, -1/2],\n",
       "[   0,    1, -1/2],\n",
       "[-1/2, -1/2,    0]])"
      ]
     },
     "execution_count": 983,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "A-B"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 984,
   "id": "22660a3d",
   "metadata": {},
   "outputs": [],
   "source": [
    "P,D=(A-B).diagonalize()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 985,
   "id": "19c2f7be",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\left[\\begin{matrix}-1 & - \\frac{1}{2} + \\frac{\\sqrt{3}}{2} & - \\frac{\\sqrt{3}}{2} - \\frac{1}{2}\\\\1 & - \\frac{1}{2} + \\frac{\\sqrt{3}}{2} & - \\frac{\\sqrt{3}}{2} - \\frac{1}{2}\\\\0 & 1 & 1\\end{matrix}\\right]$"
      ],
      "text/plain": [
       "Matrix([\n",
       "[-1, -1/2 + sqrt(3)/2, -sqrt(3)/2 - 1/2],\n",
       "[ 1, -1/2 + sqrt(3)/2, -sqrt(3)/2 - 1/2],\n",
       "[ 0,                1,                1]])"
      ]
     },
     "execution_count": 985,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "P"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 986,
   "id": "968edb29",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\left[\\begin{matrix}1 & 0 & 0\\\\0 & \\frac{1}{2} - \\frac{\\sqrt{3}}{2} & 0\\\\0 & 0 & \\frac{1}{2} + \\frac{\\sqrt{3}}{2}\\end{matrix}\\right]$"
      ],
      "text/plain": [
       "Matrix([\n",
       "[1,               0,               0],\n",
       "[0, 1/2 - sqrt(3)/2,               0],\n",
       "[0,               0, 1/2 + sqrt(3)/2]])"
      ]
     },
     "execution_count": 986,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "D"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 991,
   "id": "534b98e6",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\left[\\begin{matrix}2 & 0 & 0\\\\0 & 3 - \\sqrt{3} & 0\\\\0 & 0 & \\sqrt{3} + 3\\end{matrix}\\right]$"
      ],
      "text/plain": [
       "Matrix([\n",
       "[2,           0,           0],\n",
       "[0, 3 - sqrt(3),           0],\n",
       "[0,           0, sqrt(3) + 3]])"
      ]
     },
     "execution_count": 991,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "simplify(P.T*P)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 993,
   "id": "b0b0b0c5",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{1: 1, 1/2 - sqrt(3)/2: 1, 1/2 + sqrt(3)/2: 1}"
      ]
     },
     "execution_count": 993,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "(A-B).eigenvals()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 996,
   "id": "6b3db3e7",
   "metadata": {},
   "outputs": [],
   "source": [
    "r=symbols(\"r\",positive=True)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 997,
   "id": "43648b3f",
   "metadata": {},
   "outputs": [],
   "source": [
    "c=Circle(O,r)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 998,
   "id": "c78b32a5",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\operatorname{Circle}\\left(\\operatorname{Point2D}\\left(0, 0\\right), r\\right)$"
      ],
      "text/plain": [
       "Circle(Point2D(0, 0), r)"
      ]
     },
     "execution_count": 998,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "c"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 999,
   "id": "523bc4ab",
   "metadata": {},
   "outputs": [],
   "source": [
    "x0,y0=symbols(\"x0,y0\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1000,
   "id": "164e3d35",
   "metadata": {},
   "outputs": [],
   "source": [
    "l=Line((y-y0)-k*(x-x0))\n",
    "\n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1001,
   "id": "52594277",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle - k x + k x_{0} + y - y_{0}$"
      ],
      "text/plain": [
       "-k*x + k*x0 + y - y0"
      ]
     },
     "execution_count": 1001,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "l.equation()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1002,
   "id": "546273d2",
   "metadata": {},
   "outputs": [],
   "source": [
    "A,B=Intersection(l,c)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1004,
   "id": "7309395b",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\operatorname{Point2D}\\left(\\frac{k x_{0} + \\frac{k \\sqrt{k^{2} r^{2} - k^{2} x_{0}^{2} + 2 k x_{0} y_{0} + r^{2} - y_{0}^{2}}}{k^{2} + 1} - y_{0} - \\frac{k x_{0} - y_{0}}{k^{2} + 1}}{k}, \\frac{k \\sqrt{k^{2} r^{2} - k^{2} x_{0}^{2} + 2 k x_{0} y_{0} + r^{2} - y_{0}^{2}}}{k^{2} + 1} - \\frac{k x_{0} - y_{0}}{k^{2} + 1}\\right)$"
      ],
      "text/plain": [
       "Point2D((k*x0 + k*sqrt(k**2*r**2 - k**2*x0**2 + 2*k*x0*y0 + r**2 - y0**2)/(k**2 + 1) - y0 - (k*x0 - y0)/(k**2 + 1))/k, k*sqrt(k**2*r**2 - k**2*x0**2 + 2*k*x0*y0 + r**2 - y0**2)/(k**2 + 1) - (k*x0 - y0)/(k**2 + 1))"
      ]
     },
     "execution_count": 1004,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "\n",
    "simplify(A)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1005,
   "id": "7791f451",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\operatorname{Point2D}\\left(\\frac{k x_{0} - \\frac{k \\sqrt{k^{2} r^{2} - k^{2} x_{0}^{2} + 2 k x_{0} y_{0} + r^{2} - y_{0}^{2}}}{k^{2} + 1} - y_{0} - \\frac{k x_{0} - y_{0}}{k^{2} + 1}}{k}, - \\frac{k \\sqrt{k^{2} r^{2} - k^{2} x_{0}^{2} + 2 k x_{0} y_{0} + r^{2} - y_{0}^{2}}}{k^{2} + 1} - \\frac{k x_{0} - y_{0}}{k^{2} + 1}\\right)$"
      ],
      "text/plain": [
       "Point2D((k*x0 - k*sqrt(k**2*r**2 - k**2*x0**2 + 2*k*x0*y0 + r**2 - y0**2)/(k**2 + 1) - y0 - (k*x0 - y0)/(k**2 + 1))/k, -k*sqrt(k**2*r**2 - k**2*x0**2 + 2*k*x0*y0 + r**2 - y0**2)/(k**2 + 1) - (k*x0 - y0)/(k**2 + 1))"
      ]
     },
     "execution_count": 1005,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "B"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1006,
   "id": "0442b165",
   "metadata": {},
   "outputs": [],
   "source": [
    "P=c.arbitrary_point()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1008,
   "id": "98fc86af",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\operatorname{Point2D}\\left(r \\cos{\\left(t \\right)}, r \\sin{\\left(t \\right)}\\right)$"
      ],
      "text/plain": [
       "Point2D(r*cos(t), r*sin(t))"
      ]
     },
     "execution_count": 1008,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "P"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1009,
   "id": "1c701453",
   "metadata": {},
   "outputs": [],
   "source": [
    "check=Line(P,A).slope*Line(P,B).slope"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1013,
   "id": "76ba85f3",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\frac{- k^{2} r^{2} \\cos^{2}{\\left(t \\right)} + k^{2} x_{0}^{2} + 2 k r x_{0} \\sin{\\left(t \\right)} - 2 k x_{0} y_{0} - r^{2} \\cos^{2}{\\left(t \\right)} + r^{2} - 2 r y_{0} \\sin{\\left(t \\right)} + y_{0}^{2}}{k^{2} r^{2} \\cos^{2}{\\left(t \\right)} - 2 k^{2} r x_{0} \\cos{\\left(t \\right)} + k^{2} x_{0}^{2} + 2 k r y_{0} \\cos{\\left(t \\right)} - 2 k x_{0} y_{0} + r^{2} \\cos^{2}{\\left(t \\right)} - r^{2} + y_{0}^{2}}$"
      ],
      "text/plain": [
       "(-k**2*r**2*cos(t)**2 + k**2*x0**2 + 2*k*r*x0*sin(t) - 2*k*x0*y0 - r**2*cos(t)**2 + r**2 - 2*r*y0*sin(t) + y0**2)/(k**2*r**2*cos(t)**2 - 2*k**2*r*x0*cos(t) + k**2*x0**2 + 2*k*r*y0*cos(t) - 2*k*x0*y0 + r**2*cos(t)**2 - r**2 + y0**2)"
      ]
     },
     "execution_count": 1013,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "simplify(check)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1014,
   "id": "df24396a",
   "metadata": {},
   "outputs": [],
   "source": [
    "expr=factor(_)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1015,
   "id": "f9c2880c",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\frac{- k^{2} r^{2} \\cos^{2}{\\left(t \\right)} + k^{2} x_{0}^{2} + 2 k r x_{0} \\sin{\\left(t \\right)} - 2 k x_{0} y_{0} - r^{2} \\cos^{2}{\\left(t \\right)} + r^{2} - 2 r y_{0} \\sin{\\left(t \\right)} + y_{0}^{2}}{k^{2} r^{2} \\cos^{2}{\\left(t \\right)} - 2 k^{2} r x_{0} \\cos{\\left(t \\right)} + k^{2} x_{0}^{2} + 2 k r y_{0} \\cos{\\left(t \\right)} - 2 k x_{0} y_{0} + r^{2} \\cos^{2}{\\left(t \\right)} - r^{2} + y_{0}^{2}}$"
      ],
      "text/plain": [
       "(-k**2*r**2*cos(t)**2 + k**2*x0**2 + 2*k*r*x0*sin(t) - 2*k*x0*y0 - r**2*cos(t)**2 + r**2 - 2*r*y0*sin(t) + y0**2)/(k**2*r**2*cos(t)**2 - 2*k**2*r*x0*cos(t) + k**2*x0**2 + 2*k*r*y0*cos(t) - 2*k*x0*y0 + r**2*cos(t)**2 - r**2 + y0**2)"
      ]
     },
     "execution_count": 1015,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "expr"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1018,
   "id": "43453d39",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle - k^{2} r^{2} \\cos^{2}{\\left(t \\right)} + k^{2} x_{0}^{2} + 2 k r x_{0} \\sin{\\left(t \\right)} - 2 k x_{0} y_{0} - r^{2} \\cos^{2}{\\left(t \\right)} + r^{2} - 2 r y_{0} \\sin{\\left(t \\right)} + y_{0}^{2}$"
      ],
      "text/plain": [
       "-k**2*r**2*cos(t)**2 + k**2*x0**2 + 2*k*r*x0*sin(t) - 2*k*x0*y0 - r**2*cos(t)**2 + r**2 - 2*r*y0*sin(t) + y0**2"
      ]
     },
     "execution_count": 1018,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "fraction(expr)[0]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1023,
   "id": "c27d7db9",
   "metadata": {},
   "outputs": [],
   "source": [
    "eq=Eq(fraction(expr)[1]*m,fraction(expr)[0])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1024,
   "id": "ad2645cb",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle m \\left(k^{2} r^{2} \\cos^{2}{\\left(t \\right)} - 2 k^{2} r x_{0} \\cos{\\left(t \\right)} + k^{2} x_{0}^{2} + 2 k r y_{0} \\cos{\\left(t \\right)} - 2 k x_{0} y_{0} + r^{2} \\cos^{2}{\\left(t \\right)} - r^{2} + y_{0}^{2}\\right) = - k^{2} r^{2} \\cos^{2}{\\left(t \\right)} + k^{2} x_{0}^{2} + 2 k r x_{0} \\sin{\\left(t \\right)} - 2 k x_{0} y_{0} - r^{2} \\cos^{2}{\\left(t \\right)} + r^{2} - 2 r y_{0} \\sin{\\left(t \\right)} + y_{0}^{2}$"
      ],
      "text/plain": [
       "Eq(m*(k**2*r**2*cos(t)**2 - 2*k**2*r*x0*cos(t) + k**2*x0**2 + 2*k*r*y0*cos(t) - 2*k*x0*y0 + r**2*cos(t)**2 - r**2 + y0**2), -k**2*r**2*cos(t)**2 + k**2*x0**2 + 2*k*r*x0*sin(t) - 2*k*x0*y0 - r**2*cos(t)**2 + r**2 - 2*r*y0*sin(t) + y0**2)"
      ]
     },
     "execution_count": 1024,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "eq"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1025,
   "id": "e51f35e7",
   "metadata": {},
   "outputs": [],
   "source": [
    "expr=eq.lhs-eq.rhs"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1026,
   "id": "e7df0006",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle k^{2} r^{2} \\cos^{2}{\\left(t \\right)} - k^{2} x_{0}^{2} - 2 k r x_{0} \\sin{\\left(t \\right)} + 2 k x_{0} y_{0} + m \\left(k^{2} r^{2} \\cos^{2}{\\left(t \\right)} - 2 k^{2} r x_{0} \\cos{\\left(t \\right)} + k^{2} x_{0}^{2} + 2 k r y_{0} \\cos{\\left(t \\right)} - 2 k x_{0} y_{0} + r^{2} \\cos^{2}{\\left(t \\right)} - r^{2} + y_{0}^{2}\\right) + r^{2} \\cos^{2}{\\left(t \\right)} - r^{2} + 2 r y_{0} \\sin{\\left(t \\right)} - y_{0}^{2}$"
      ],
      "text/plain": [
       "k**2*r**2*cos(t)**2 - k**2*x0**2 - 2*k*r*x0*sin(t) + 2*k*x0*y0 + m*(k**2*r**2*cos(t)**2 - 2*k**2*r*x0*cos(t) + k**2*x0**2 + 2*k*r*y0*cos(t) - 2*k*x0*y0 + r**2*cos(t)**2 - r**2 + y0**2) + r**2*cos(t)**2 - r**2 + 2*r*y0*sin(t) - y0**2"
      ]
     },
     "execution_count": 1026,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "expr"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1028,
   "id": "5c01c144",
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle k^{2} \\left(m r^{2} \\cos^{2}{\\left(t \\right)} - 2 m r x_{0} \\cos{\\left(t \\right)} + m x_{0}^{2} + r^{2} \\cos^{2}{\\left(t \\right)} - x_{0}^{2}\\right) + k \\left(2 m r y_{0} \\cos{\\left(t \\right)} - 2 m x_{0} y_{0} - 2 r x_{0} \\sin{\\left(t \\right)} + 2 x_{0} y_{0}\\right) + m r^{2} \\cos^{2}{\\left(t \\right)} - m r^{2} + m y_{0}^{2} + r^{2} \\cos^{2}{\\left(t \\right)} - r^{2} + 2 r y_{0} \\sin{\\left(t \\right)} - y_{0}^{2}$"
      ],
      "text/plain": [
       "k**2*(m*r**2*cos(t)**2 - 2*m*r*x0*cos(t) + m*x0**2 + r**2*cos(t)**2 - x0**2) + k*(2*m*r*y0*cos(t) - 2*m*x0*y0 - 2*r*x0*sin(t) + 2*x0*y0) + m*r**2*cos(t)**2 - m*r**2 + m*y0**2 + r**2*cos(t)**2 - r**2 + 2*r*y0*sin(t) - y0**2"
      ]
     },
     "execution_count": 1028,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "collect(expand(expr),k)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1030,
   "id": "f733986b",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "19.53125"
      ]
     },
     "execution_count": 1030,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "10**4/2**9"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1031,
   "id": "4ff4e96f",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\sin{\\left(x \\right)}$"
      ],
      "text/plain": [
       "sin(x)"
      ]
     },
     "execution_count": 1031,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "sin(pi-x)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1032,
   "id": "4b4bdfe0",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle 0.0174532925199433$"
      ],
      "text/plain": [
       "0.0174532925199433"
      ]
     },
     "execution_count": 1032,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "N(pi/180)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1033,
   "id": "d08410ae",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle 57.2957795130823$"
      ],
      "text/plain": [
       "57.2957795130823"
      ]
     },
     "execution_count": 1033,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "N(180/pi)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1034,
   "id": "5d56232e",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\left|{\\sin{\\left(x \\right)}}\\right| + \\left|{\\cos{\\left(x \\right)}}\\right|$"
      ],
      "text/plain": [
       "Abs(sin(x)) + Abs(cos(x))"
      ]
     },
     "execution_count": 1034,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "expr=abs(sin(x))+abs(cos(x))\n",
    "expr"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1035,
   "id": "f56e2ddf",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/plain": [
       "<sympy.plotting.plot.Plot at 0x7f264d5b6c10>"
      ]
     },
     "execution_count": 1035,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "plot(expr,(x,-2*pi,2*pi))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1152,
   "id": "1df974b2",
   "metadata": {},
   "outputs": [],
   "source": [
    "from typing import List"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1153,
   "id": "b35cccf4",
   "metadata": {},
   "outputs": [],
   "source": [
    "def solve_univariate_inequals(inequals: List,x,domain=Reals,relational=False):\n",
    "    answer_domain=domain\n",
    "    for i in range(len(inequals)):\n",
    "        answer_domain=solve_univariate_inequality(inequals[i],x,False,answer_domain)\n",
    "    if(relational):\n",
    "        # return\n",
    "        pass\n",
    "    else:\n",
    "        return answer_domain"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1154,
   "id": "6a4ac2c1",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\left(-\\infty, -1\\right) \\cup \\left(\\frac{1}{2}, \\infty\\right)$"
      ],
      "text/plain": [
       "Union(Interval.open(-oo, -1), Interval.open(1/2, oo))"
      ]
     },
     "execution_count": 1154,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "solve_univariate_inequals([-3<-2/x+1,-2/x+1<3],x,Reals)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1155,
   "id": "f5c6bb72",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\operatorname{Point2D}\\left(-4, 0\\right)$"
      ],
      "text/plain": [
       "Point2D(-4, 0)"
      ]
     },
     "execution_count": 1155,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "A=Point(-4,0)\n",
    "A"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1156,
   "id": "436944c7",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\operatorname{Point2D}\\left(2, 3\\right)$"
      ],
      "text/plain": [
       "Point2D(2, 3)"
      ]
     },
     "execution_count": 1156,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "B=Point(2,3)\n",
    "B"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1157,
   "id": "deaac33b",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\operatorname{Point2D}\\left(4, -5\\right)$"
      ],
      "text/plain": [
       "Point2D(4, -5)"
      ]
     },
     "execution_count": 1157,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "C=Point(4,-5)\n",
    "C"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1158,
   "id": "1a2fd9b3",
   "metadata": {},
   "outputs": [],
   "source": [
    "tri=Triangle(A,B,C)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1159,
   "id": "7a3aae00",
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "image/svg+xml": [
       "<svg xmlns=\"http://www.w3.org/2000/svg\"\n",
       "            xmlns:xlink=\"http://www.w3.org/1999/xlink\"\n",
       "            width=\"100.0\" height=\"100.0\" viewBox=\"-0.320000000000000 -5.72000000000000 5.04000000000000 8.64000000000000\"\n",
       "            preserveAspectRatio=\"xMinYMin meet\">\n",
       "            <defs>\n",
       "                <marker id=\"markerCircle\" markerWidth=\"8\" markerHeight=\"8\"\n",
       "                    refx=\"5\" refy=\"5\" markerUnits=\"strokeWidth\">\n",
       "                    <circle cx=\"5\" cy=\"5\" r=\"1.5\" style=\"stroke: none; fill:#000000;\"/>\n",
       "                </marker>\n",
       "                <marker id=\"markerArrow\" markerWidth=\"13\" markerHeight=\"13\" refx=\"2\" refy=\"4\"\n",
       "                       orient=\"auto\" markerUnits=\"strokeWidth\">\n",
       "                    <path d=\"M2,2 L2,6 L6,4\" style=\"fill: #000000;\" />\n",
       "                </marker>\n",
       "                <marker id=\"markerReverseArrow\" markerWidth=\"13\" markerHeight=\"13\" refx=\"6\" refy=\"4\"\n",
       "                       orient=\"auto\" markerUnits=\"strokeWidth\">\n",
       "                    <path d=\"M6,2 L6,6 L2,4\" style=\"fill: #000000;\" />\n",
       "                </marker>\n",
       "            </defs><g transform=\"matrix(1,0,0,-1,0,-2.80000000000000)\"><path fill-rule=\"evenodd\" fill=\"#66cc99\" stroke=\"#555555\" stroke-width=\"0.172800000000000\" opacity=\"0.6\" d=\"M 4.00000000000000,-5.00000000000000 L 0.400000000000000,2.20000000000000\" /></g></svg>"
      ],
      "text/latex": [
       "$\\displaystyle \\operatorname{Segment2D}\\left(\\operatorname{Point2D}\\left(4, -5\\right), \\operatorname{Point2D}\\left(\\frac{2}{5}, \\frac{11}{5}\\right)\\right)$"
      ],
      "text/plain": [
       "Segment2D(Point2D(4, -5), Point2D(2/5, 11/5))"
      ]
     },
     "execution_count": 1159,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "tri.altitudes[C]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1161,
   "id": "c0c8ea61",
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle - \\frac{18 \\cdot \\left(2 x + y - 3\\right)}{5}$"
      ],
      "text/plain": [
       "-18*(2*x + y - 3)/5"
      ]
     },
     "execution_count": 1161,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "factor(Line(tri.altitudes[C]).equation())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1162,
   "id": "f12c5f49",
   "metadata": {},
   "outputs": [],
   "source": [
    "A=Point(1,1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1163,
   "id": "b423b7b6",
   "metadata": {},
   "outputs": [],
   "source": [
    "B=Point(3,5)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1164,
   "id": "1d37dc62",
   "metadata": {},
   "outputs": [],
   "source": [
    "C=Point(-3,3)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1165,
   "id": "98367a81",
   "metadata": {},
   "outputs": [],
   "source": [
    "tri=Triangle(A,B,C)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1166,
   "id": "8fcb69da",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle - 3 x - y + 4$"
      ],
      "text/plain": [
       "-3*x - y + 4"
      ]
     },
     "execution_count": 1166,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "tri.eulerline.equation()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1174,
   "id": "5c90a6fc",
   "metadata": {},
   "outputs": [],
   "source": [
    "h=Hyperbola(O,1,1,slope=1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1176,
   "id": "9c216477",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle 2 x y - 1$"
      ],
      "text/plain": [
       "2*x*y - 1"
      ]
     },
     "execution_count": 1176,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "simplify(h.equation())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1177,
   "id": "9de30d45",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(Point2D(-1, -1), Point2D(1, 1))"
      ]
     },
     "execution_count": 1177,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "h.foci"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1179,
   "id": "3bf2242a",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\sqrt{2}$"
      ],
      "text/plain": [
       "sqrt(2)"
      ]
     },
     "execution_count": 1179,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "h.focus_distance"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1184,
   "id": "1edad74c",
   "metadata": {
    "collapsed": true
   },
   "outputs": [
    {
     "ename": "TypeError",
     "evalue": "Input args to Union must be Sets",
     "output_type": "error",
     "traceback": [
      "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
      "\u001b[0;31mTypeError\u001b[0m                                 Traceback (most recent call last)",
      "\u001b[0;32m/tmp/ipykernel_5587/892712827.py\u001b[0m in \u001b[0;36m<module>\u001b[0;34m\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mIntersection\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mh\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0mPoint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0mRational\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m2\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m",
      "\u001b[0;32m~/anaconda3/lib/python3.9/site-packages/sympy/sets/sets.py\u001b[0m in \u001b[0;36m__new__\u001b[0;34m(cls, *args, **kwargs)\u001b[0m\n\u001b[1;32m   1479\u001b[0m         \u001b[0;32mif\u001b[0m \u001b[0mevaluate\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m   1480\u001b[0m             \u001b[0margs\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mlist\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mcls\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_new_args_filter\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1481\u001b[0;31m             \u001b[0;32mreturn\u001b[0m \u001b[0msimplify_intersection\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m   1482\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m   1483\u001b[0m         \u001b[0margs\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mlist\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mordered\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mSet\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_infimum_key\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m~/anaconda3/lib/python3.9/site-packages/sympy/sets/sets.py\u001b[0m in \u001b[0;36msimplify_intersection\u001b[0;34m(args)\u001b[0m\n\u001b[1;32m   2576\u001b[0m     \u001b[0;32mfor\u001b[0m \u001b[0marg\u001b[0m \u001b[0;32min\u001b[0m \u001b[0margs\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m   2577\u001b[0m         \u001b[0;32mif\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0misinstance\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0marg\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mSet\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 2578\u001b[0;31m             \u001b[0;32mraise\u001b[0m \u001b[0mTypeError\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"Input args to Union must be Sets\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m   2579\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m   2580\u001b[0m     \u001b[0;31m# If any EmptySets return EmptySet\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;31mTypeError\u001b[0m: Input args to Union must be Sets"
     ]
    }
   ],
   "source": [
    "Intersection(h,Point(1,Rational(1,2)))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1185,
   "id": "862f0e47",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\left\\{\\operatorname{Point2D}\\left(\\frac{1}{4}, 2\\right)\\right\\}$"
      ],
      "text/plain": [
       "{Point2D(1/4, 2)}"
      ]
     },
     "execution_count": 1185,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "Intersection(h,Line(Point(1,2),Point(3,2)))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1188,
   "id": "ad5a56e8",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\operatorname{Ellipse}\\left(\\operatorname{Point2D}\\left(0, 0\\right), a, a \\sqrt{1 - \\left(- \\frac{1}{2} + \\frac{\\sqrt{5}}{2}\\right)^{2}}\\right)$"
      ],
      "text/plain": [
       "Ellipse(Point2D(0, 0), a, a*sqrt(1 - (-1/2 + sqrt(5)/2)**2))"
      ]
     },
     "execution_count": 1188,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "e"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1189,
   "id": "f2edc60b",
   "metadata": {
    "collapsed": true
   },
   "outputs": [
    {
     "ename": "TypeError",
     "evalue": "Input args to Union must be Sets",
     "output_type": "error",
     "traceback": [
      "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
      "\u001b[0;31mTypeError\u001b[0m                                 Traceback (most recent call last)",
      "\u001b[0;32m/tmp/ipykernel_5587/2896869322.py\u001b[0m in \u001b[0;36m<module>\u001b[0;34m\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mIntersection\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0me\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0mPoint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m2\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m",
      "\u001b[0;32m~/anaconda3/lib/python3.9/site-packages/sympy/sets/sets.py\u001b[0m in \u001b[0;36m__new__\u001b[0;34m(cls, *args, **kwargs)\u001b[0m\n\u001b[1;32m   1479\u001b[0m         \u001b[0;32mif\u001b[0m \u001b[0mevaluate\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m   1480\u001b[0m             \u001b[0margs\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mlist\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mcls\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_new_args_filter\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1481\u001b[0;31m             \u001b[0;32mreturn\u001b[0m \u001b[0msimplify_intersection\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m   1482\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m   1483\u001b[0m         \u001b[0margs\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mlist\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mordered\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mSet\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_infimum_key\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m~/anaconda3/lib/python3.9/site-packages/sympy/sets/sets.py\u001b[0m in \u001b[0;36msimplify_intersection\u001b[0;34m(args)\u001b[0m\n\u001b[1;32m   2576\u001b[0m     \u001b[0;32mfor\u001b[0m \u001b[0marg\u001b[0m \u001b[0;32min\u001b[0m \u001b[0margs\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m   2577\u001b[0m         \u001b[0;32mif\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0misinstance\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0marg\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mSet\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 2578\u001b[0;31m             \u001b[0;32mraise\u001b[0m \u001b[0mTypeError\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"Input args to Union must be Sets\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m   2579\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m   2580\u001b[0m     \u001b[0;31m# If any EmptySets return EmptySet\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;31mTypeError\u001b[0m: Input args to Union must be Sets"
     ]
    }
   ],
   "source": [
    "Intersection(e,Point(1,2))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1190,
   "id": "47f6a090",
   "metadata": {},
   "outputs": [],
   "source": [
    "e=Ellipse(O,4,sqrt(12))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1191,
   "id": "192817f8",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\frac{x^{2}}{16} + \\frac{y^{2}}{12} - 1$"
      ],
      "text/plain": [
       "x**2/16 + y**2/12 - 1"
      ]
     },
     "execution_count": 1191,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "e.equation()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1192,
   "id": "29e6a9a0",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\frac{m}{2} - \\frac{x}{2} + y$"
      ],
      "text/plain": [
       "m/2 - x/2 + y"
      ]
     },
     "execution_count": 1192,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "l=Line(x-2*y-m)\n",
    "l.equation()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1193,
   "id": "5cd692f0",
   "metadata": {},
   "outputs": [],
   "source": [
    "expr=line_and_quadratic(l,e,first=False)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1194,
   "id": "3329390b",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle 3 m^{2} + 12 m y + 16 y^{2} - 48$"
      ],
      "text/plain": [
       "3*m**2 + 12*m*y + 16*y**2 - 48"
      ]
     },
     "execution_count": 1194,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "expr"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1196,
   "id": "1ccd01e6",
   "metadata": {},
   "outputs": [],
   "source": [
    "q=quadratic_function(expr,x=y)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1198,
   "id": "902cd573",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\left\\{64\\right\\}$"
      ],
      "text/plain": [
       "{64}"
      ]
     },
     "execution_count": 1198,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "solveset(q.delta,m**2)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1199,
   "id": "92688f0b",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\frac{x^{2}}{4} + \\frac{y^{2}}{3} - 1$"
      ],
      "text/plain": [
       "x**2/4 + y**2/3 - 1"
      ]
     },
     "execution_count": 1199,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "e=Ellipse(O,2,sqrt(3))\n",
    "e.equation()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1201,
   "id": "9ad280c9",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle - n + \\frac{x}{4} + y$"
      ],
      "text/plain": [
       "-n + x/4 + y"
      ]
     },
     "execution_count": 1201,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "l=Line(y+x/4-n)\n",
    "l.equation()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1202,
   "id": "a2b84196",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle 16 n^{2} - 8 n x + 13 x^{2} - 48$"
      ],
      "text/plain": [
       "16*n**2 - 8*n*x + 13*x**2 - 48"
      ]
     },
     "execution_count": 1202,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "line_and_ellipse_quadratic(l,e)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1203,
   "id": "b9c85ca5",
   "metadata": {},
   "outputs": [],
   "source": [
    "q=quadratic_function(_)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1204,
   "id": "cbdc599d",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\left(- \\frac{\\sqrt{13}}{2}, \\frac{\\sqrt{13}}{2}\\right)$"
      ],
      "text/plain": [
       "Interval.open(-sqrt(13)/2, sqrt(13)/2)"
      ]
     },
     "execution_count": 1204,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "solveset(q.delta>0,n,Reals)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1205,
   "id": "d41c1986",
   "metadata": {},
   "outputs": [],
   "source": [
    "e=Ellipse(O,2,sqrt(2))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1206,
   "id": "cd5534f1",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\frac{x^{2}}{4} + \\frac{y^{2}}{2} - 1$"
      ],
      "text/plain": [
       "x**2/4 + y**2/2 - 1"
      ]
     },
     "execution_count": 1206,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "\n",
    "e.equation()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1207,
   "id": "2f6868db",
   "metadata": {},
   "outputs": [],
   "source": [
    "M=e.arbitrary_point()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1208,
   "id": "9cd0813a",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\operatorname{Point2D}\\left(2 \\cos{\\left(t \\right)}, \\sqrt{2} \\sin{\\left(t \\right)}\\right)$"
      ],
      "text/plain": [
       "Point2D(2*cos(t), sqrt(2)*sin(t))"
      ]
     },
     "execution_count": 1208,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "\n",
    "M"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1209,
   "id": "6686d456",
   "metadata": {},
   "outputs": [],
   "source": [
    "A1,A2=Intersection(e,Line(y))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1210,
   "id": "17117468",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\operatorname{Point2D}\\left(-2, 0\\right)$"
      ],
      "text/plain": [
       "Point2D(-2, 0)"
      ]
     },
     "execution_count": 1210,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "A1"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1211,
   "id": "d0c9af14",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\operatorname{Point2D}\\left(2, 0\\right)$"
      ],
      "text/plain": [
       "Point2D(2, 0)"
      ]
     },
     "execution_count": 1211,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "A2"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1218,
   "id": "7b9685bd",
   "metadata": {},
   "outputs": [],
   "source": [
    "N=list(Intersection(Line(M,A1),Line(x)))[0]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1219,
   "id": "e2b78bde",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\operatorname{Point2D}\\left(0, \\frac{\\sqrt{2} \\sin{\\left(t \\right)}}{\\cos{\\left(t \\right)} + 1}\\right)$"
      ],
      "text/plain": [
       "Point2D(0, sqrt(2)*sin(t)/(cos(t) + 1))"
      ]
     },
     "execution_count": 1219,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "N"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1220,
   "id": "4d7db642",
   "metadata": {
    "scrolled": true
   },
   "outputs": [],
   "source": [
    "k1=Line(N,A2).slope"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1221,
   "id": "b9b7d2d7",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle - \\frac{\\sqrt{2} \\sin{\\left(t \\right)}}{2 \\cos{\\left(t \\right)} + 2}$"
      ],
      "text/plain": [
       "-sqrt(2)*sin(t)/(2*cos(t) + 2)"
      ]
     },
     "execution_count": 1221,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "k1"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1214,
   "id": "dadaccfb",
   "metadata": {},
   "outputs": [],
   "source": [
    "k2=Line(M,A2).slope"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1215,
   "id": "321e172b",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\frac{\\sqrt{2} \\sin{\\left(t \\right)}}{2 \\left(\\cos{\\left(t \\right)} - 1\\right)}$"
      ],
      "text/plain": [
       "sqrt(2)*sin(t)/(2*(cos(t) - 1))"
      ]
     },
     "execution_count": 1215,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "k2"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1222,
   "id": "3b17eda7",
   "metadata": {},
   "outputs": [],
   "source": [
    "answer=k1+k2"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1223,
   "id": "faee0346",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle - \\frac{\\sqrt{2}}{\\sin{\\left(t \\right)}}$"
      ],
      "text/plain": [
       "-sqrt(2)/sin(t)"
      ]
     },
     "execution_count": 1223,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "trigsimp(answer)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1240,
   "id": "8495f8c1",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "True"
      ]
     },
     "execution_count": 1240,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "x1 in Reals"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1225,
   "id": "a19cf5d2",
   "metadata": {},
   "outputs": [],
   "source": [
    "x1,x2=symbols(\"x1,x2\",positive=True)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1226,
   "id": "de4abcb3",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\operatorname{Point2D}\\left(x_{1}, \\frac{\\sqrt{3} x_{1}}{3}\\right)$"
      ],
      "text/plain": [
       "Point2D(x1, sqrt(3)*x1/3)"
      ]
     },
     "execution_count": 1226,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "A=Point(x1,x1/sqrt(3))\n",
    "A"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1227,
   "id": "02c06ed8",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\operatorname{Point2D}\\left(x_{2}, - \\frac{\\sqrt{3} x_{2}}{3}\\right)$"
      ],
      "text/plain": [
       "Point2D(x2, -sqrt(3)*x2/3)"
      ]
     },
     "execution_count": 1227,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "B=Point(x2,-x2/sqrt(3))\n",
    "B"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1228,
   "id": "6918cdf1",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\frac{\\sqrt{3} x \\left(x_{1} + x_{2}\\right)}{3} - \\frac{2 \\sqrt{3} x_{1} x_{2}}{3} + y \\left(- x_{1} + x_{2}\\right)$"
      ],
      "text/plain": [
       "sqrt(3)*x*(x1 + x2)/3 - 2*sqrt(3)*x1*x2/3 + y*(-x1 + x2)"
      ]
     },
     "execution_count": 1228,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "l=Line(A,B)\n",
    "l.equation()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1230,
   "id": "c154cee7",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\frac{x^{2}}{3} - y^{2} - 1$"
      ],
      "text/plain": [
       "x**2/3 - y**2 - 1"
      ]
     },
     "execution_count": 1230,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "h=Hyperbola(O,sqrt(3),1)\n",
    "h.equation()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1231,
   "id": "41de953c",
   "metadata": {},
   "outputs": [],
   "source": [
    "P,Q=Intersection(h,l)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1232,
   "id": "c6c2256d",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\operatorname{Point2D}\\left(\\frac{2 x_{1} x_{2} + \\left(\\sqrt{3} x_{1} - \\sqrt{3} x_{2}\\right) \\left(\\frac{\\sqrt{3} \\left(x_{1} - x_{2}\\right)}{6} - \\frac{\\sqrt{3} \\sqrt{4 x_{1}^{2} x_{2}^{2} - 3 x_{1}^{2} + x_{1} x_{2} \\left(x_{1} - x_{2}\\right)^{2} - 6 x_{1} x_{2} - 3 x_{2}^{2}}}{6 \\sqrt{x_{1}} \\sqrt{x_{2}}}\\right)}{x_{1} + x_{2}}, \\frac{\\sqrt{3} \\left(x_{1} - x_{2}\\right)}{6} - \\frac{\\sqrt{3} \\sqrt{4 x_{1}^{2} x_{2}^{2} - 3 x_{1}^{2} + x_{1} x_{2} \\left(x_{1} - x_{2}\\right)^{2} - 6 x_{1} x_{2} - 3 x_{2}^{2}}}{6 \\sqrt{x_{1}} \\sqrt{x_{2}}}\\right)$"
      ],
      "text/plain": [
       "Point2D((2*x1*x2 + (sqrt(3)*x1 - sqrt(3)*x2)*(sqrt(3)*(x1 - x2)/6 - sqrt(3)*sqrt(4*x1**2*x2**2 - 3*x1**2 + x1*x2*(x1 - x2)**2 - 6*x1*x2 - 3*x2**2)/(6*sqrt(x1)*sqrt(x2))))/(x1 + x2), sqrt(3)*(x1 - x2)/6 - sqrt(3)*sqrt(4*x1**2*x2**2 - 3*x1**2 + x1*x2*(x1 - x2)**2 - 6*x1*x2 - 3*x2**2)/(6*sqrt(x1)*sqrt(x2)))"
      ]
     },
     "execution_count": 1232,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "P"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1234,
   "id": "b117e7f3",
   "metadata": {},
   "outputs": [],
   "source": [
    "AP=P.distance(A)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1235,
   "id": "c8577ad4",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\sqrt{\\left(- x_{1} + \\frac{2 x_{1} x_{2} + \\left(\\sqrt{3} x_{1} - \\sqrt{3} x_{2}\\right) \\left(\\frac{\\sqrt{3} \\left(x_{1} - x_{2}\\right)}{6} - \\frac{\\sqrt{3} \\sqrt{4 x_{1}^{2} x_{2}^{2} - 3 x_{1}^{2} + x_{1} x_{2} \\left(x_{1} - x_{2}\\right)^{2} - 6 x_{1} x_{2} - 3 x_{2}^{2}}}{6 \\sqrt{x_{1}} \\sqrt{x_{2}}}\\right)}{x_{1} + x_{2}}\\right)^{2} + \\left(- \\frac{\\sqrt{3} x_{1}}{3} + \\frac{\\sqrt{3} \\left(x_{1} - x_{2}\\right)}{6} - \\frac{\\sqrt{3} \\sqrt{4 x_{1}^{2} x_{2}^{2} - 3 x_{1}^{2} + x_{1} x_{2} \\left(x_{1} - x_{2}\\right)^{2} - 6 x_{1} x_{2} - 3 x_{2}^{2}}}{6 \\sqrt{x_{1}} \\sqrt{x_{2}}}\\right)^{2}}$"
      ],
      "text/plain": [
       "sqrt((-x1 + (2*x1*x2 + (sqrt(3)*x1 - sqrt(3)*x2)*(sqrt(3)*(x1 - x2)/6 - sqrt(3)*sqrt(4*x1**2*x2**2 - 3*x1**2 + x1*x2*(x1 - x2)**2 - 6*x1*x2 - 3*x2**2)/(6*sqrt(x1)*sqrt(x2))))/(x1 + x2))**2 + (-sqrt(3)*x1/3 + sqrt(3)*(x1 - x2)/6 - sqrt(3)*sqrt(4*x1**2*x2**2 - 3*x1**2 + x1*x2*(x1 - x2)**2 - 6*x1*x2 - 3*x2**2)/(6*sqrt(x1)*sqrt(x2)))**2)"
      ]
     },
     "execution_count": 1235,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "AP"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1236,
   "id": "49c086c9",
   "metadata": {},
   "outputs": [],
   "source": [
    "BP=P.distance(B)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1238,
   "id": "8e93f16a",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\frac{\\sqrt{\\left(x_{1} + x_{2}\\right)^{2} \\left(\\sqrt{x_{1}} \\sqrt{x_{2}} \\left(x_{1} + x_{2}\\right) + \\sqrt{4 x_{1}^{2} x_{2}^{2} - 3 x_{1}^{2} + x_{1} x_{2} \\left(x_{1} - x_{2}\\right)^{2} - 6 x_{1} x_{2} - 3 x_{2}^{2}}\\right)^{2} + 3 \\left(- 4 x_{1}^{\\frac{3}{2}} x_{2}^{\\frac{3}{2}} + 2 x_{1}^{\\frac{3}{2}} \\sqrt{x_{2}} \\left(x_{1} + x_{2}\\right) - \\left(x_{1} - x_{2}\\right) \\left(\\sqrt{x_{1}} \\sqrt{x_{2}} \\left(x_{1} - x_{2}\\right) - \\sqrt{4 x_{1}^{2} x_{2}^{2} - 3 x_{1}^{2} + x_{1} x_{2} \\left(x_{1} - x_{2}\\right)^{2} - 6 x_{1} x_{2} - 3 x_{2}^{2}}\\right)\\right)^{2}}}{\\sqrt{\\left(x_{1} + x_{2}\\right)^{2} \\left(\\sqrt{x_{1}} \\sqrt{x_{2}} \\left(x_{1} + x_{2}\\right) - \\sqrt{4 x_{1}^{2} x_{2}^{2} - 3 x_{1}^{2} + x_{1} x_{2} \\left(x_{1} - x_{2}\\right)^{2} - 6 x_{1} x_{2} - 3 x_{2}^{2}}\\right)^{2} + 3 \\left(- 4 x_{1}^{\\frac{3}{2}} x_{2}^{\\frac{3}{2}} + 2 \\sqrt{x_{1}} x_{2}^{\\frac{3}{2}} \\left(x_{1} + x_{2}\\right) - \\left(x_{1} - x_{2}\\right) \\left(\\sqrt{x_{1}} \\sqrt{x_{2}} \\left(x_{1} - x_{2}\\right) - \\sqrt{4 x_{1}^{2} x_{2}^{2} - 3 x_{1}^{2} + x_{1} x_{2} \\left(x_{1} - x_{2}\\right)^{2} - 6 x_{1} x_{2} - 3 x_{2}^{2}}\\right)\\right)^{2}}}$"
      ],
      "text/plain": [
       "sqrt((x1 + x2)**2*(sqrt(x1)*sqrt(x2)*(x1 + x2) + sqrt(4*x1**2*x2**2 - 3*x1**2 + x1*x2*(x1 - x2)**2 - 6*x1*x2 - 3*x2**2))**2 + 3*(-4*x1**(3/2)*x2**(3/2) + 2*x1**(3/2)*sqrt(x2)*(x1 + x2) - (x1 - x2)*(sqrt(x1)*sqrt(x2)*(x1 - x2) - sqrt(4*x1**2*x2**2 - 3*x1**2 + x1*x2*(x1 - x2)**2 - 6*x1*x2 - 3*x2**2)))**2)/sqrt((x1 + x2)**2*(sqrt(x1)*sqrt(x2)*(x1 + x2) - sqrt(4*x1**2*x2**2 - 3*x1**2 + x1*x2*(x1 - x2)**2 - 6*x1*x2 - 3*x2**2))**2 + 3*(-4*x1**(3/2)*x2**(3/2) + 2*sqrt(x1)*x2**(3/2)*(x1 + x2) - (x1 - x2)*(sqrt(x1)*sqrt(x2)*(x1 - x2) - sqrt(4*x1**2*x2**2 - 3*x1**2 + x1*x2*(x1 - x2)**2 - 6*x1*x2 - 3*x2**2)))**2)"
      ]
     },
     "execution_count": 1238,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "simplify(AP/BP)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1241,
   "id": "a47bd6c9",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\frac{2 x_{1}^{\\frac{3}{2}} x_{2}^{\\frac{3}{2}} + \\sqrt{x_{1}} \\sqrt{x_{2}} \\left(x_{1}^{2} + x_{2}^{2}\\right) - x_{1} \\sqrt{x_{1}^{3} x_{2} + 2 x_{1}^{2} x_{2}^{2} - 3 x_{1}^{2} + x_{1} x_{2}^{3} - 6 x_{1} x_{2} - 3 x_{2}^{2}} + x_{2} \\sqrt{x_{1}^{3} x_{2} + 2 x_{1}^{2} x_{2}^{2} - 3 x_{1}^{2} + x_{1} x_{2}^{3} - 6 x_{1} x_{2} - 3 x_{2}^{2}}}{2 \\sqrt{x_{1}} \\sqrt{x_{2}} \\left(x_{1} + x_{2}\\right)}$"
      ],
      "text/plain": [
       "(2*x1**(3/2)*x2**(3/2) + sqrt(x1)*sqrt(x2)*(x1**2 + x2**2) - x1*sqrt(x1**3*x2 + 2*x1**2*x2**2 - 3*x1**2 + x1*x2**3 - 6*x1*x2 - 3*x2**2) + x2*sqrt(x1**3*x2 + 2*x1**2*x2**2 - 3*x1**2 + x1*x2**3 - 6*x1*x2 - 3*x2**2))/(2*sqrt(x1)*sqrt(x2)*(x1 + x2))"
      ]
     },
     "execution_count": 1241,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "simplify(expand(P.x))\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "0b4844e6",
   "metadata": {},
   "source": [
    "####  We need to use another way to solve it."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1249,
   "id": "4adef994",
   "metadata": {},
   "outputs": [],
   "source": [
    "x0,y0=symbols(\"x0,y0\",positive=True)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1251,
   "id": "b44e00bf",
   "metadata": {},
   "outputs": [],
   "source": [
    "l=Line((y-y0)-k*(x-x0))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1252,
   "id": "a04698eb",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle - k x + k x_{0} + y - y_{0}$"
      ],
      "text/plain": [
       "-k*x + k*x0 + y - y0"
      ]
     },
     "execution_count": 1252,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "l.equation()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1253,
   "id": "d7e1eaf8",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle - \\frac{\\sqrt{3} x}{3} + y$"
      ],
      "text/plain": [
       "-sqrt(3)*x/3 + y"
      ]
     },
     "execution_count": 1253,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "l1=Line(y-x/sqrt(3))\n",
    "l1.equation()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1254,
   "id": "8f723e67",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\frac{\\sqrt{3} x}{3} + y$"
      ],
      "text/plain": [
       "sqrt(3)*x/3 + y"
      ]
     },
     "execution_count": 1254,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "l2=Line(y+x/sqrt(3))\n",
    "l2.equation()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1260,
   "id": "90efed5c",
   "metadata": {},
   "outputs": [],
   "source": [
    "A=list(Intersection(l,l1))[0]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1261,
   "id": "a8d4ac28",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\operatorname{Point2D}\\left(\\frac{3 \\left(k x_{0} - y_{0}\\right)}{3 k - \\sqrt{3}}, \\frac{\\sqrt{3} \\left(k x_{0} - y_{0}\\right)}{3 k - \\sqrt{3}}\\right)$"
      ],
      "text/plain": [
       "Point2D(3*(k*x0 - y0)/(3*k - sqrt(3)), sqrt(3)*(k*x0 - y0)/(3*k - sqrt(3)))"
      ]
     },
     "execution_count": 1261,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "A"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1262,
   "id": "dbd44689",
   "metadata": {},
   "outputs": [],
   "source": [
    "B=list(Intersection(l,l2))[0]\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1263,
   "id": "40a87329",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\operatorname{Point2D}\\left(\\frac{3 \\left(k x_{0} - y_{0}\\right)}{3 k + \\sqrt{3}}, \\frac{\\sqrt{3} \\left(- k x_{0} + y_{0}\\right)}{3 k + \\sqrt{3}}\\right)$"
      ],
      "text/plain": [
       "Point2D(3*(k*x0 - y0)/(3*k + sqrt(3)), sqrt(3)*(-k*x0 + y0)/(3*k + sqrt(3)))"
      ]
     },
     "execution_count": 1263,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "B"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1264,
   "id": "5bcb1a20",
   "metadata": {},
   "outputs": [],
   "source": [
    "AP=A.x-x0"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1265,
   "id": "532cb085",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle - x_{0} + \\frac{3 \\left(k x_{0} - y_{0}\\right)}{3 k - \\sqrt{3}}$"
      ],
      "text/plain": [
       "-x0 + 3*(k*x0 - y0)/(3*k - sqrt(3))"
      ]
     },
     "execution_count": 1265,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "AP"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1266,
   "id": "43c64cad",
   "metadata": {},
   "outputs": [],
   "source": [
    "BP=B.x-x0"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1267,
   "id": "85189a9b",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle - x_{0} + \\frac{3 \\left(k x_{0} - y_{0}\\right)}{3 k + \\sqrt{3}}$"
      ],
      "text/plain": [
       "-x0 + 3*(k*x0 - y0)/(3*k + sqrt(3))"
      ]
     },
     "execution_count": 1267,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "BP"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1273,
   "id": "6f2f245d",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle m \\left(- x_{0} + \\frac{3 \\left(k x_{0} - y_{0}\\right)}{3 k + \\sqrt{3}}\\right) - x_{0} + \\frac{3 \\left(k x_{0} - y_{0}\\right)}{3 k - \\sqrt{3}}$"
      ],
      "text/plain": [
       "m*(-x0 + 3*(k*x0 - y0)/(3*k + sqrt(3))) - x0 + 3*(k*x0 - y0)/(3*k - sqrt(3))"
      ]
     },
     "execution_count": 1273,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "expr=AP+m*BP\n",
    "expr"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1289,
   "id": "2e7b188a",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\frac{x_{0} \\left(- \\sqrt{3} k m + \\sqrt{3} k + m + 1\\right)}{3 k m + 3 k - \\sqrt{3} m + \\sqrt{3}}$"
      ],
      "text/plain": [
       "x0*(-sqrt(3)*k*m + sqrt(3)*k + m + 1)/(3*k*m + 3*k - sqrt(3)*m + sqrt(3))"
      ]
     },
     "execution_count": 1289,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "list(solveset(expr,y0))[0]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1290,
   "id": "c5d20378",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle - \\frac{x_{0} \\left(\\sqrt{3} k m - \\sqrt{3} k - m - 1\\right)}{3 k m + 3 k - \\sqrt{3} m + \\sqrt{3}}$"
      ],
      "text/plain": [
       "-x0*(sqrt(3)*k*m - sqrt(3)*k - m - 1)/(3*k*m + 3*k - sqrt(3)*m + sqrt(3))"
      ]
     },
     "execution_count": 1290,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "factor(_)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1279,
   "id": "22ef3632",
   "metadata": {},
   "outputs": [],
   "source": [
    "expr_final=expr.subs(y0,list(solveset(h.equation(x0,y0),y0))[1])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1280,
   "id": "37b00f25",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle m \\left(- x_{0} + \\frac{3 \\left(k x_{0} - \\frac{\\sqrt{3} \\sqrt{x_{0}^{2} - 3}}{3}\\right)}{3 k + \\sqrt{3}}\\right) - x_{0} + \\frac{3 \\left(k x_{0} - \\frac{\\sqrt{3} \\sqrt{x_{0}^{2} - 3}}{3}\\right)}{3 k - \\sqrt{3}}$"
      ],
      "text/plain": [
       "m*(-x0 + 3*(k*x0 - sqrt(3)*sqrt(x0**2 - 3)/3)/(3*k + sqrt(3))) - x0 + 3*(k*x0 - sqrt(3)*sqrt(x0**2 - 3)/3)/(3*k - sqrt(3))"
      ]
     },
     "execution_count": 1280,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "expr_final"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1283,
   "id": "acd17a75",
   "metadata": {},
   "outputs": [],
   "source": [
    "answer=list(solveset(expr_final,m))[0]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1285,
   "id": "d785cb86",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\frac{\\sqrt{3} k x_{0} - k \\sqrt{3 x_{0}^{2} - 9} + x_{0} - \\sqrt{x_{0}^{2} - 3}}{\\sqrt{3} k x_{0} + \\sqrt{3} k \\sqrt{x_{0}^{2} - 3} - x_{0} - \\sqrt{x_{0}^{2} - 3}}$"
      ],
      "text/plain": [
       "(sqrt(3)*k*x0 - k*sqrt(3*x0**2 - 9) + x0 - sqrt(x0**2 - 3))/(sqrt(3)*k*x0 + sqrt(3)*k*sqrt(x0**2 - 3) - x0 - sqrt(x0**2 - 3))"
      ]
     },
     "execution_count": 1285,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "simplify(answer)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "df263ba3",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": 1292,
   "id": "af7e946c",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\operatorname{Point2D}\\left(x_{1}, \\frac{\\sqrt{3} x_{1}}{3}\\right)$"
      ],
      "text/plain": [
       "Point2D(x1, sqrt(3)*x1/3)"
      ]
     },
     "execution_count": 1292,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "A=Point(x1,x1/sqrt(3))\n",
    "A"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1293,
   "id": "92f45158",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\operatorname{Point2D}\\left(x_{2}, - \\frac{\\sqrt{3} x_{2}}{3}\\right)$"
      ],
      "text/plain": [
       "Point2D(x2, -sqrt(3)*x2/3)"
      ]
     },
     "execution_count": 1293,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "B=Point(x2,-x2/sqrt(3))\n",
    "B"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1294,
   "id": "3aa360ee",
   "metadata": {},
   "outputs": [],
   "source": [
    "P=A/(1+m)+m/(1+m)*B"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1295,
   "id": "89330c64",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\operatorname{Point2D}\\left(\\frac{m x_{2} + x_{1}}{m + 1}, \\frac{\\sqrt{3} \\left(- m x_{2} + x_{1}\\right)}{3 \\left(m + 1\\right)}\\right)$"
      ],
      "text/plain": [
       "Point2D((m*x2 + x1)/(m + 1), sqrt(3)*(-m*x2 + x1)/(3*(m + 1)))"
      ]
     },
     "execution_count": 1295,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "P"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1298,
   "id": "76ac5003",
   "metadata": {},
   "outputs": [],
   "source": [
    "expr=h.equation(x,y).subs({x:P.x,y:P.y})"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1299,
   "id": "2c1becba",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\frac{4 m x_{1} x_{2}}{3 m^{2} + 6 m + 3} - 1$"
      ],
      "text/plain": [
       "4*m*x1*x2/(3*m**2 + 6*m + 3) - 1"
      ]
     },
     "execution_count": 1299,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "expand(expr)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1302,
   "id": "b8b7d986",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\frac{x^{2}}{4} + \\frac{y^{2}}{3} - 1$"
      ],
      "text/plain": [
       "x**2/4 + y**2/3 - 1"
      ]
     },
     "execution_count": 1302,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "e=Ellipse(O,2,sqrt(3))\n",
    "e.equation()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1303,
   "id": "329c616b",
   "metadata": {},
   "outputs": [],
   "source": [
    "A=Point(2,0)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1304,
   "id": "d59bfc57",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "True"
      ]
     },
     "execution_count": 1304,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "A in e"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1305,
   "id": "d74c6f87",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle - k x + 2 k + y$"
      ],
      "text/plain": [
       "-k*x + 2*k + y"
      ]
     },
     "execution_count": 1305,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "l=Line(y-k*(x-2))\n",
    "l.equation()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1312,
   "id": "d021dadf",
   "metadata": {},
   "outputs": [],
   "source": [
    "B=simplify(list(Intersection(l,e))[1])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1313,
   "id": "f088c47d",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\operatorname{Point2D}\\left(\\frac{2 k - \\frac{12 k}{4 k^{2} + 3}}{k}, - \\frac{12 k}{4 k^{2} + 3}\\right)$"
      ],
      "text/plain": [
       "Point2D((2*k - 12*k/(4*k**2 + 3))/k, -12*k/(4*k**2 + 3))"
      ]
     },
     "execution_count": 1313,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "B"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1347,
   "id": "99a331b4",
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\frac{2 \\cdot \\left(4 k^{2} - 3\\right)}{4 k^{2} + 3}$"
      ],
      "text/plain": [
       "2*(4*k**2 - 3)/(4*k**2 + 3)"
      ]
     },
     "execution_count": 1347,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "simplify(B.x)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1315,
   "id": "7c554ae7",
   "metadata": {},
   "outputs": [],
   "source": [
    "F=e.foci[1]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1316,
   "id": "7fb7802c",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\operatorname{Point2D}\\left(1, 0\\right)$"
      ],
      "text/plain": [
       "Point2D(1, 0)"
      ]
     },
     "execution_count": 1316,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "F"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1317,
   "id": "d1d3368c",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\operatorname{Point2D}\\left(0, t\\right)$"
      ],
      "text/plain": [
       "Point2D(0, t)"
      ]
     },
     "execution_count": 1317,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "H=Point(0,t)\n",
    "H"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1318,
   "id": "c4af0ceb",
   "metadata": {},
   "outputs": [],
   "source": [
    "expr=Line(F,B).slope*Line(H,F).slope"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1323,
   "id": "8f7a886d",
   "metadata": {},
   "outputs": [],
   "source": [
    "H=Point(0,list(solveset(expr+1,t))[0])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1324,
   "id": "2aad38e2",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\operatorname{Point2D}\\left(0, - \\frac{4 k^{2} - 9}{12 k}\\right)$"
      ],
      "text/plain": [
       "Point2D(0, -(4*k**2 - 9)/(12*k))"
      ]
     },
     "execution_count": 1324,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "H"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1327,
   "id": "371e13d1",
   "metadata": {},
   "outputs": [],
   "source": [
    "l1=l.perpendicular_line(H)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1342,
   "id": "275b8b90",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle - \\frac{k^{2}}{3} - k y - x + \\frac{3}{4}$"
      ],
      "text/plain": [
       "-k**2/3 - k*y - x + 3/4"
      ]
     },
     "execution_count": 1342,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "l1.equation()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1330,
   "id": "4d3b59f9",
   "metadata": {},
   "outputs": [],
   "source": [
    "M=list(Intersection(l1,l))[0]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1331,
   "id": "964a97f7",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\operatorname{Point2D}\\left(\\frac{20 k^{2} + 9}{12 \\left(k^{2} + 1\\right)}, \\frac{k \\left(- 4 k^{2} - 15\\right)}{12 \\left(k^{2} + 1\\right)}\\right)$"
      ],
      "text/plain": [
       "Point2D((20*k**2 + 9)/(12*(k**2 + 1)), k*(-4*k**2 - 15)/(12*(k**2 + 1)))"
      ]
     },
     "execution_count": 1331,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "M\n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1332,
   "id": "968e9f73",
   "metadata": {},
   "outputs": [],
   "source": [
    "k1=Line(O,M).slope"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1348,
   "id": "ee91cfaf",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle - \\frac{k \\left(4 k^{2} + 15\\right)}{20 k^{2} + 9}$"
      ],
      "text/plain": [
       "-k*(4*k**2 + 15)/(20*k**2 + 9)"
      ]
     },
     "execution_count": 1348,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "k1"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1349,
   "id": "9336799b",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle - \\frac{k \\left(4 k^{2} + 15\\right)}{20 k^{2} + 9} + k$"
      ],
      "text/plain": [
       "-k*(4*k**2 + 15)/(20*k**2 + 9) + k"
      ]
     },
     "execution_count": 1349,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "k1+k"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1335,
   "id": "f45e74f3",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\left(-\\infty, - \\frac{\\sqrt{6}}{4}\\right) \\cup \\left(0, \\frac{\\sqrt{6}}{4}\\right)$"
      ],
      "text/plain": [
       "Union(Interval.open(-oo, -sqrt(6)/4), Interval.open(0, sqrt(6)/4))"
      ]
     },
     "execution_count": 1335,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "solveset(k1+k<0,k,Reals)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "189acce2",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": 1336,
   "id": "b2593f51",
   "metadata": {},
   "outputs": [],
   "source": [
    "expr=line_and_quadratic(l,e)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1338,
   "id": "673d5350",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle - 16 k^{2} x + 16 k^{2} + x^{2} \\cdot \\left(4 k^{2} + 3\\right) - 12$"
      ],
      "text/plain": [
       "-16*k**2*x + 16*k**2 + x**2*(4*k**2 + 3) - 12"
      ]
     },
     "execution_count": 1338,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "collect(expand(expr),x)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1339,
   "id": "10388288",
   "metadata": {},
   "outputs": [],
   "source": [
    "\n",
    "q=quadratic_function(_)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1341,
   "id": "398ff63e",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle 144$"
      ],
      "text/plain": [
       "144"
      ]
     },
     "execution_count": 1341,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "simplify(q.delta)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1345,
   "id": "af883ab5",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "4"
      ]
     },
     "execution_count": 1345,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "e563bd35",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "c97a718c",
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.9.13"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
